使用以下代码从互联网下载rar文件时,下载的文件比实际大。 不知道是什么原因造成的?
bis = new BufferedInputStream(urlConn.getInputStream());
bos = new BufferedOutputStream(new FileOutputStream(outputFile));
eventBus.fireEvent(this, new DownloadStartedEvent(item));
int read;
byte[] buffer = new byte[2048];
while ((read = bis.read(buffer)) != -1) {
bos.write(buffer);
}
eventBus.fireEvent(this, new DownloadCompletedEvent(item));
答案 0 :(得分:4)
即使read(byte[])
操作没有完全填充,您也会在每次写入时向输出写入一个完整的缓冲区。
此外,由于您已经在阅读byte[]
,因此缓冲流只是适得其反的开销。使用带有单字节read()
和write()
方法的缓冲流。
这是一个更好的模式。
InputStream is = urlConn.getInputStream();
try {
FileOutputStream os = new FileOutputStream(outputFile);
try {
byte[] buffer = new byte[2048];
while (true) {
int n = is.read(buffer);
if (n < 0)
break;
os.write(buffer, 0, n);
}
os.flush();
} finally {
os.close();
}
} finally {
is.close();
}
答案 1 :(得分:2)
尝试使用调用BufferedOutputStream写入一个长度
bos.write(buffer, 0, read)
答案 2 :(得分:2)
不要重新发明轮子:使用已经实现(和调试!)此代码的Jakarta Commons IO库。具体来说,请查看IOUtils.copy()
哦是的,正如 erickson 所示,您需要在使用它们后关闭您的流。 IOUtils
也有一种方法可以做到这一点。