1 回答
TA贡献1804条经验 获得超3个赞
您复制的代码不正确。它假设(错误地)每次调用read都会返回buffer.lengthbytes 或 return -1。
您应该做的是捕获每次在变量中读取的字节数,然后准确写入该字节数。您用于关闭流的代码很冗长并且(理论上1)也有错误。
这是解决这两个问题以及其他一些问题的重写。
void copyBufferedFile(BufferedInputStream bufferedInputStream,
BufferedOutputStream bufferedOutputStream)
throws IOException
{
try (BufferedInputStream in = bufferedInputStream;
BufferedOutputStream out = bufferedOutputStream)
{
byte[] buf = new byte[1024];
int nosRead;
while ((nosRead = in.read(buf)) != -1) // read this carefully ...
{
out.write(buf, 0, nosRead);
}
}
}
正如您所看到的,我已经摆脱了虚假的“捕获和挤压异常”处理程序,并使用 Java 7+ try with resources修复了资源泄漏。
仍然存在几个问题:
复制函数最好将文件名字符串(或
File
对象Path
)作为参数并负责打开流。鉴于您正在执行块读取和写入,因此使用缓冲流没有什么价值。(事实上,它可能会使 I/O 变慢。)最好使用普通流并使缓冲区的大小与类使用的默认缓冲区大小相同或
Buffered*
更大。
1 - 理论上,如果抛出bufferedInputStream.close()
异常,bufferedOutputStream.close()
调用将被跳过。实际上,关闭输入流不太可能引发异常。但无论哪种方式,尝试资源方法都会正确且更加简洁地处理这个问题。
添加回答
举报