当我在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)
答案 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)复制文件。