我正在编写一个Android应用程序,它将资产中的文件复制到设备驱动器上的一个文件中(没有权限问题,字节从资产到驱动器)。我需要复制的文件大于1 MB,因此我将其拆分为多个文件,然后将其复制为:
try {
out = new FileOutputStream(destination);
for (InputStream file : files /* InputStreams from assets */) {
copyFile(file);
file.close();
}
out.close();
System.out.println(bytesCopied); // shows 8716288
System.out.println(new File(destination).length()); // shows 8749056
} catch (IOException e) {
Log.e("ERROR", "Cannot copy file.");
return;
}
然后,copyFile()
方法:
private void copyFile(InputStream file) throws IOException {
byte[] buffer = new byte[16384];
int length;
while ((length = file.read(buffer)) > 0) {
out.write(buffer);
bytesCopied += length;
out.flush();
}
}
目标文件应包含的正确字节数是8716288(这是我查看原始文件时获得的,如果我计算Android应用程序中的写入字节数),但new File(destination).length()
显示8749056
我做错了什么?
答案 0 :(得分:6)
文件大小变得太大,因为你没有为每次写入写length
个字节,你实际上每次写入整个缓冲区,这是buffer.length()bytes。
您应该使用write(byte[] b, int off, int len)
重载来指定每次迭代时要在缓冲区中写入的字节数。
答案 1 :(得分:3)
你不是要写
out.write(buffer, 0, length);
而不是
out.write(buffer);
否则,即使读取的字节数较少,也总是会写入完整的缓冲区。这可能会导致更大的文件(在原始数据之间填充一些垃圾)。