2012-10-18 96 views
11

我经历了一些关于Java IO的文件,只是想确认我是否可以得到这个权利:缓冲和无缓冲流在Java中

无缓冲输入流:的FileInputStream,InputStreamReader的,的FileReader

无缓冲输出流:FileOutputStream中,OutputStreamWriter,FileWriter的

缓冲输出流:为PrintStream,PrintWriter的

另外,我们有BufferedInputStream,BufferedOutputStream,BufferedReader和BufferedWriter流来将未缓冲的流转换成缓冲版本。

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

我说的一切都正确吗?

P.S. - 据我所知,这个缓冲问题是有些依赖于实现的,但我只是想确认的javadoc在说什么经验

+3

听起来或多或少是对的,但是你应该依赖它在Javadoc中所说的内容,而不是其他人所说的。实施必须按照Javadoc中的说法进行。你遗漏了'ObjectOutputStream',它们都被缓冲了,这取决于它究竟在做什么。您也忽略了过滤器流和读者。 – EJP

+0

还没有去那么远;) – Chatterjee

+0

我喜欢这个问题。没有问题要解决,只是寻求理解。这很令人耳目一新。 –

回答

1

规则:

  1. 任何的InputStream /读卡器直接从外部源读取( FileInputStream,SocketInputStream等)是'原始的'并被认为是无缓冲的。 (虽然实际上,可能有一些缓冲正在进行,取决于实现)

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

  3. OuputStreams/Writers的假设相同。

  4. 其他流装饰器(即GZIPInputStream,MD5InputStream,YourSpecialObjectWriter)可能会做一些缓冲,但是它对缓冲源不是很有害。