2010-04-23 59 views
0

使用下面的代码从互联网下载rar文件时,下载的文件比实际大。 不确定是什么原因造成的?Java:使用BufferedInputStream,BufferedOutputStream下载问题

 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)); 

回答

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(); 
} 
2

尝试使用调用的BufferedOutputStream写,需要一个长度

bos.write(buffer, 0, read)

2

不要重新发明轮子:(!和调试)使用Jakarta Commons IO库,它已经实现了这个代码。具体来看,看看IOUtils.copy()

哦是的,因为erickson显示,你需要关闭你的流后使用它们。 IOUtils也有一个方法来做到这一点。

+0

yes流在finally块中关闭,但为了简洁起见没有粘贴。看看公用事业,非常有趣 – nkr1pt 2010-04-23 19:37:46