在 java 中使用 bufferedstream 复制时的数据大小差异

data size difference when copying with bufferedstream in java

当我在 java 中使用 bufferedstream 复制文件时,复制的文件看起来与原始文件大小不同。为什么会这样? (但是,文件是完美的作品)

这是我的代码:

fileIn = new FileInputStream("guitar_sim.mp3");
bufferIn = new BufferedInputStream(fileIn);
fileOut = new FileOutputStream("test_song1.mp3");
bufferOut = new BufferedOutputStream(fileOut);

//int data = 0;
byte[] data = new byte[1000]; 
long startT = System.currentTimeMillis();
System.out.println(Calendar.getInstance().getTime());
while((bufferIn.read(data))!=-1) {
    bufferOut.write(data);
}
long endT = System.currentTimeMillis();
System.out.println(Calendar.getInstance().getTime());
System.out.println(endT-startT);

输出:

Mon Jul 27 15:56:52 KST 2015
Mon Jul 27 15:56:53 KST 2015
102

原始数据大小:2871KB (guitar_sim.mp3)
复制的数据大小:2868KB (test_song1.mp3)

顺便说一下,更好的方法是使用 try-resource。它调用最后的刷新并自动关闭。

现在解决你的问题。读取方法 returns 已读取到缓冲区的字节数。事实上,您向 OutputStream 写入了太多字节。这是一个可能的解决方案:

try (InputStream is = new FileInputStream("guitar_sim.mp3");
     OutputStream os = new FileOutputStream("test_song1.mp3")) {
  byte[] data = new byte[2048];
  int size;
  while ((size = is.read(data)) != -1) {
    os.write(data, 0, size);
  }
} catch (IOException e) {
  e.printStackTrace();
}

您也可以使用NIO通过Files#copy(Path, Path)复制文件。