Java:使用BufferedInputStream、BufferedOutputStream下载问题
使用下面的代码从internet下载rar文件时,下载的文件比实际文件大。 不知道是什么原因造成的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
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,非常有趣