【问题标题】:Is BufferedInputStream and BufferedOutputstream different from InputStream and OutputstreamBufferedInputStream 和 BufferedOutputstream 与 InputStream 和 Outputstream 不同吗
【发布时间】:2014-12-14 07:12:22
【问题描述】:

最近,当我试图在我的 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
}

【问题讨论】:

  • 不可读是什么意思?真的不可读吗?截断结果?空的文件 ?请注意在最后明确关闭文件!它们是Buffered*Streams,因此不关闭它们可能会导致 unflushed 最后写入...
  • 你需要flush你的缓冲区。这会将缓冲区中剩余的所有剩余数据写入您的流中。
  • 您确定您的代码正确吗?你读到了buffered 而不是bufferedIn。您似乎过于简化了您的代码......请给我们原始代码。你真的要关闭BufferedOutputStream 吗?
  • 我确实关闭了它,我需要冲洗它吗??

标签: java android inputstream


【解决方案1】:

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

【讨论】:

  • 刷新...或关闭。一般来说,关闭更好,因为它也可以处理资源泄漏。
【解决方案2】:

无论如何,您可能想要flush() 您的输出(由close() 隐式完成),但是使用BufferedOutputStream 这比使用其他OutputStreams 更重要。如果您有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 中缓冲的数据没有被刷新。

【讨论】:

  • 我可以在android上使用java 7吗..我在linux上使用openJdk 6我关闭了所有流...它是一个word文档
  • 您可以而且应该使用 Java 7 for Android。
猜你喜欢
  • 2018-02-25
  • 2012-08-03
  • 2014-08-14
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2019-09-17
相关资源
最近更新 更多