Java 中的缓冲和非缓冲流

Posted

技术标签:

【中文标题】Java 中的缓冲和非缓冲流【英文标题】:Buffered and Unbuffered Streams in Java 【发布时间】:2012-10-08 09:14:21 【问题描述】:

我正在浏览一些关于 Java IO 的文档,只是想确定我是否正确:

无缓冲输入流:FileInputStream、InputStreamReader、FileReader

无缓冲输出流:FileOutputStream、OutputStreamWriter、FileWriter

缓冲输出流:PrintStream、PrintWriter

此外,我们还有 BufferedInputStream、BufferedOutputStream、BufferedReader 和 BufferedWriter 流来将无缓冲的流转换为有缓冲的版本。

最后,我观察到对于字符流,即。 InputStreamReader、FileReader、OutputStreamWriter、FileWriter,在将字节发送到流中之前,会为字节维护一个内部字节缓冲区。这个字节缓冲区不在我们的控制之下。因此,对于字符流来说,缓冲是指用于存储进出程序的字符的高级字符缓冲区。

我说的都对吗?

附: - 我知道这个缓冲问题在一定程度上取决于实现,但我只想确认 javadocs 所说的内容

【问题讨论】:

这听起来或多或少是对的,但您应该依赖它在 Javadoc 中所说的内容,而不是其他任何人所说的内容。实现有义务按照它在 Javadoc 中所说的去做。您遗漏了ObjectOutputStream,,它既是缓冲的又不是缓冲的,这取决于它到底在做什么。您还省略了过滤器流和阅读器。 我喜欢这个问题。没有问题要解决,只是寻求理解。这令人耳目一新。 我同意文档不清楚究竟缓冲了什么,例如for OutputStreamWriter @EJP:只需确认列表的其余部分:PushBackInputStream 和 PushBackReader 显然已缓冲。但是,我无法确定 LineNumberInputStream、DataInputStream 和 DataOutputStream、FilterInputStream 和 FilterOutputStream 是否被缓冲。此外,我发现奇怪的是 Buffered(Input/Output)Stream 是 Filter(Input/Output)Stream 的子类。但是,对于 Buffered(Reader/Writer),它不是 Filter(Reader/Writer) 的子类,而是直接扩展 (Reader/Writer)。我期待这里有一个类比。 @EJP:最后,在 ObjectOutputStream 的情况下,您所说的“是否都被缓冲,取决于它到底在做什么”是什么意思?另外,ObjectInputStream 呢?很抱歉给您带来不便。 【参考方案1】:

经验法则:

    任何直接从外部源(FileInputStream、SocketInputStream 等)读取的 InputStream/Reader 都是“原始的”并且被认为是无缓冲的。 (虽然实际上可能会发生一些缓冲,具体取决于实现)

    任何“原始”InputStream 或 Reader 都可以由 BufferedInputStream 或 BufferedReader 缓冲。

    OuputStreams / Writers 的假设相同。

    其他流装饰器(即 GZIPInputStream、MD5InputStream、YourSpecialObjectWriter)可能会做一些缓冲,但对缓冲源的危害并不大。

【讨论】:

以上是关于Java 中的缓冲和非缓冲流的主要内容,如果未能解决你的问题,请参考以下文章

java字节缓冲流和字符缓冲流

Java第三阶段学习(缓冲流)

java中的缓冲流

Java中的缓冲流

java缓冲流BufferWriter的原理跟提高效率原因

缓冲流之字节缓冲流