最近,当我试图在我的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
}
答案 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
中缓冲的数据未被刷新。