计数字节和总字节数不同

时间:2011-06-26 13:34:25

标签: java android

我正在编写一个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

我做错了什么?

2 个答案:

答案 0 :(得分:6)

文件大小变得太大,因为你没有为每次写入写length个字节,你实际上每次写入整个缓冲区,这是buffer.length()bytes。

您应该使用write(byte[] b, int off, int len)重载来指定每次迭代时要在缓冲区中写入的字节数。

答案 1 :(得分:3)

你不是要写

out.write(buffer, 0, length);

而不是

out.write(buffer);

否则,即使读取的字节数较少,也总是会写入完整的缓冲区。这可能会导致更大的文件(在原始数据之间填充一些垃圾)。