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

时间:2015-07-27 07:19:01

标签: java io

当我在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)

1 个答案:

答案 0 :(得分:0)

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

现在你的问题。 read方法返回已读取到缓冲区的字节数。事实上,你正在为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)复制文件。