Gadgetbridge/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/FileUtils.java

74 lines
2.7 KiB
Java
Raw Normal View History

package nodomain.freeyourgadget.gadgetbridge.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.FileChannel;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
public class FileUtils {
/**
* Copies the the given sourceFile to destFile, overwriting it, in case it exists.
2015-07-25 21:52:52 +02:00
*
* @param sourceFile
* @param destFile
* @throws IOException
*/
public static void copyFile(File sourceFile, File destFile) throws IOException {
if (!sourceFile.exists()) {
throw new IOException("Does not exist: " + sourceFile.getAbsolutePath());
}
copyFile(new FileInputStream(sourceFile), new FileOutputStream(destFile));
}
private static void copyFile(FileInputStream sourceStream, FileOutputStream destStream) throws IOException {
try (FileChannel fromChannel = sourceStream.getChannel(); FileChannel toChannel = destStream.getChannel()) {
fromChannel.transferTo(0, fromChannel.size(), toChannel);
}
}
/**
* Returns the existing external storage dir.
2015-07-25 21:52:52 +02:00
*
* @throws IOException when the directory is not available
*/
public static File getExternalFilesDir() throws IOException {
File dir = GBApplication.getContext().getExternalFilesDir(null);
if (dir == null) {
throw new IOException("Unable to access external files dir: null");
}
if (!dir.exists() && !dir.mkdirs()) {
throw new IOException("Unable to access external files dir: does not exist");
}
return dir;
}
/**
* Reads the contents of the given InputStream into a byte array, but does not
2015-08-17 22:46:39 +02:00
* read more than maxLen bytes. If the stream provides more than maxLen bytes,
* an IOException is thrown.
*
* @param in the stream to read from
* @param maxLen the maximum number of bytes to read/return
* @return the bytes read from the InputStream
* @throws IOException when reading failed or when maxLen was exceeded
*/
public static byte[] readAll(InputStream in, long maxLen) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(Math.max(8192, in.available()));
byte[] buf = new byte[8192];
int read = 0;
long totalRead = 0;
while ((read = in.read(buf)) > 0) {
out.write(buf, 0, read);
totalRead += read;
if (totalRead > maxLen) {
throw new IOException("Too much data to read into memory. Got already " + totalRead + buf);
}
}
return out.toByteArray();
}
}