Java中的缓冲流和非缓冲流

Java中的缓冲流和非缓冲流,java,io,stream,buffer,Java,Io,Stream,Buffer,我正在浏览一些关于Java IO的文档,只是想确定我是否正确理解了这一点: 无缓冲输入流:FileInputStream、InputStreamReader、FileReader 无缓冲输出流:FileOutputStream、OutputStreamWriter、FileWriter 缓冲输出流:PrintStream,PrintWriter 此外,我们还有BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWrite

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

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

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

缓冲输出流:PrintStream,PrintWriter

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

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

我说的一切都对吗

另外,我知道这个缓冲问题在某种程度上取决于实现,但我只想确认一下javadocs所说的

经验法则:

  • 任何直接从外部源(FileInputStream、SocketInputStream等)读取的InputStream/读取器都是“原始”的,被认为是无缓冲的。(尽管在现实中,可能存在一些缓冲,这取决于实现)

  • 任何“原始”输入流或读取器都可以由BufferedInputStream或BufferedReader进行缓冲

  • 对输出流/写入程序的相同假设

  • 其他流装饰程序(即GZIPInputStream、MD5InputStream、您的SpecialObjectWriter)可能会进行一些缓冲,但对缓冲源代码并没有太大的危害


  • 这听起来或多或少是对的,但是您应该依赖于它在Javadoc中所说的,而不是其他人所说的。实现必须按照Javadoc中的说明进行。您遗漏了
    ObjectOutputStream,
    ,这两者都是缓冲区,也都不是缓冲区,这取决于它到底在做什么。你还遗漏了过滤流和阅读器。我喜欢这个问题。没有问题要解决,只是寻求理解。这很令人耳目一新。例如,我同意文档不清楚缓冲的确切内容。@EJP:只是确认列表的其余部分:PushBackInputStream和PushBackReader显然已缓冲。但是,我无法确定LineNumberInputStream、DataInputStream和DataOutputStream、FilterInputStream和FilterOutputStream是否被缓冲。另外,我发现奇怪的是,缓冲(输入/输出)流是过滤器(输入/输出)流的一个子类。但是,对于缓冲(读写器),它不是过滤器(读写器)的子类,而是直接扩展(读写器)。我在这里期待一个类比。@EJP:最后,在ObjectOutputStream的例子中,您所说的“两者都是缓冲区,不都是缓冲区,这取决于它到底在做什么”是什么意思?还有,ObjectInputStream呢?很抱歉给您带来不便。