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 中的缓冲和非缓冲流的主要内容,如果未能解决你的问题,请参考以下文章