Java:使用BufferedInputStream,BufferedOutputStream下载问题

时间:2010-04-23 19:09:37

标签: java downloading

使用以下代码从互联网下载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));

3 个答案:

答案 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也有一种方法可以做到这一点。