Java中的缓冲流和非缓冲流

13

我正在查看有关Java IO的一些文档,只想确保我理解得正确:

非缓冲输入流: FileInputStream, InputStreamReader, FileReader

非缓冲输出流: FileOutputStream, OutputStreamWriter, FileWriter

缓冲输出流: PrintStream, PrintWriter

此外,我们还有BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter流,用于将非缓冲流转换为缓冲版本。

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

我所说的一切都正确吗?

P.S. - 我知道这个缓冲问题在某种程度上取决于具体实现,但我只是希望确认Javadocs所说的内容。


3
听起来差不多正确,但你应该依赖于Javadoc中所说的内容,而不是其他人的话。实现必须按照Javadoc中所说的去做。你忽略了ObjectOutputStream,它既有缓冲也没有,具体取决于它正在做什么。你还省略了过滤流和读取器(Filter streams and readers)。 - user207421
我喜欢这个问题。没有解决的问题,只是寻求理解。这很令人耳目一新。 - John Kugelman
我同意文档对于例如OutputStreamWriter正在缓冲的内容并不清楚。 - Dave L.
@EJP:只是确认列表的其余部分:PushBackInputStream和PushBackReader显然是缓冲的。但是,我无法确定LineNumberInputStream、DataInputStream和DataOutputStream、FilterInputStream和FilterOutputStream是否已缓冲。另外,我发现奇怪的是,Buffered(Input/Output)Stream是Filter(Input/Output)Stream的子类。但是,在Buffered(Reader/Writer)的情况下,它不是Filter(Reader/Writer)的子类,而是直接扩展了(Reader/Writer)。我原本期望这里有一个类比。 - Chatterjee
最后,关于ObjectOutputStream,您所说的“根据具体情况,它既有缓冲区又没有缓冲区”是什么意思?另外,ObjectInputStream呢?对造成的不便表示抱歉。 - Chatterjee
ObjectOutputStream 在发送原始数据时是带缓冲的,但在发送对象时会刷新缓冲区。ObjectInputStream 是带缓冲的。我相信 所有ReaderWriter 类都是带缓冲的。 - user207421
1个回答

2

经验法则:

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

  2. 任何“原始”的InputStream或Reader都可以被BufferedInputStream或BufferedReader缓冲。

  3. 对于OutputStreams / Writers也是同样的假设。

  4. 其他流装饰器(例如GZIPInputStream、MD5InputStream、YourSpecialObjectWriter)可能会进行一些缓冲,但缓冲源不会造成太大的伤害。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接