BufferedInputStream和BufferedOutputstream与InputStream和Outputstream不同

时间:2014-12-14 07:12:22

标签: java android inputstream

最近,当我试图在我的Android应用程序中实现一个基本的文件下载器时,我遇到了使用InputStreams和OutputStreams的麻烦..详细说明这就是我做的事情..

我使用apache HttpClient类获取一个InputStream对象,然后尝试将流写入文件..但奇怪的是,当我缓冲InputStream或OutputStream时,我得到一个不可读的文件....这是代码..

//使代码简洁我删除了异常并关闭了流..

private void download(InputStream in,String fileName){   

//if i dont use the buffered thing and read directly from in everything is ok
// same is the buffered out i had to use in/outstream 
BufferedInputStream bufferedIn = new BufferedInputStream(in);  
FileOutputStream fout = new FileOutputStream(new File(fileName));  

BufferedOutputstream  bufferedOut = new BufferedOutputstream(fout);    
int read = -1;

while((read = bufferedIn.read()) != -1){
   bufferedOut.write(read);
}
//close the buffers
}

2 个答案:

答案 0 :(得分:2)

完成后必须刷新缓冲的输出流。

答案 1 :(得分:2)

在任何情况下,您可能希望flush()输出(由close()隐式完成),但使用BufferedOutputStream这比使用其他OutputStream s更重要。如果您有FileOutputStream,则执行的唯一缓冲是操作系统的缓冲。如果你有BufferedOutputStream,Java会在它上面执行自己的缓冲。

如果您使用的是Java 7或更高版本,我建议您编写如下代码:

try (BufferedInputStream bIn = new BufferedInputStream(in);
    BufferedOutputStream bOut = new BufferedOutputStream(new FileOutputStream(fileName))) {
    for (int read; ((read = bIn.read()) != -1; )
        bOut.write(read);
}

在您的情况下,我怀疑您关闭的是FileOutputStream,而不是BufferedOutputStream。因此,文件被截断甚至为空,因为BufferedOutputStream中缓冲的数据未被刷新。