Java:使用BufferedInputStream、BufferedOutputStream下载问题

Java:使用BufferedInputStream、BufferedOutputStream下载问题,java,download,Java,Download,使用下面的代码从internet下载rar文件时,下载的文件比实际文件大。 不知道是什么原因造成的 bis = new BufferedInputStream(urlConn.getInputStream()); bos = new BufferedOutputStream(new FileOutputStream(outputFile)); eventBus.fireEvent(this, new DownloadStartedEvent(it

使用下面的代码从internet下载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));

即使
读取(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();
}
InputStream is=urlConn.getInputStream();
试一试{
FileOutputStream os=新的FileOutputStream(outputFile);
试一试{
字节[]缓冲区=新字节[2048];
while(true){
int n=正在读取(缓冲区);
if(n<0)
打破
写操作(缓冲区,0,n);
}
os.flush();
}最后{
os.close();
}
}最后{
is.close();
}

尝试使用BufferedOutputStream写入调用,该调用需要一定的长度


bos.write(buffer,0,read)
不要重新发明轮子:使用库,它已经实现(并调试)了这段代码。具体来说,看看


哦,是的,正如erickson所展示的,在使用流之后,你需要关闭它们
IOUtils
也有一个方法来实现这一点。

yes流在finally块中关闭,但为了简洁起见没有粘贴它。看看commons util,非常有趣