java.io.Buffer * stream与普通流不同?

1)缓冲流如何在后台工作,它们与普通流有什么不同,使用它们的优点是什么? 2)DataInputStream也是基于字节的.但它有方法来readLine().这里有什么要点? 从BufferedInputStream javadoc: A BufferedInputStream adds functionality to another input stream-na

1)缓冲流如何在后台工作,它们与普通流有什么不同,使用它们的优点是什么?

2)DataInputStream也是基于字节的.但它有方法来readLine().这里有什么要点?

解决方法

从BufferedInputStream
javadoc:

A BufferedInputStream adds functionality to another input stream-namely,the ability to buffer the input and to support the mark and reset methods. When the BufferedInputStream is created,an internal buffer array is created. As bytes from the stream are read or skipped,the internal buffer is refilled as necessary from the contained input stream,many bytes at a time. The mark operation remembers a point in the input stream and the reset operation causes all the bytes read since the most recent mark operation to be reread before new bytes are taken from the contained input stream.

在内部使用缓冲区数组,而不是从底层输入流单独读取字节,读取足够的字节来填充缓冲区.这通常导致更快的性能,因为底层输入流需要较少的读取.

对于BufferedOutputStream则是相反的.

mark()和reset()可以如下使用:

1 BufferedInputStream bis = new BufferedInputStream(is);
2 byte[] b = new byte[4];
3 bis.read(b); // read 4 bytes into b
4 bis.mark(10); // mark the stream at the current position - we can read 10 bytes before the mark point becomes invalid
5 bis.read(b); // read another 4 bytes into b
6 bis.reset(); // resets the position in the stream back to when mark was called
7 bis.read(b); // re-read the same 4 bytes as line 5 into b

解释标记/重置一些更多…

BufferInputStream内部记住缓冲区中的当前位置.当您读取字节时,位置将递增.标记(10)的电话将保存当前位置.随后的读取调用将继续增加当前位置,但是当调用mark时,调用reset将将当前位置设置为其值.

标记的参数指定在标记位置无效之前调用标记后可以读取的字节数.一旦标记位置无效,您就不能再调用重置来返回.

例如,如果在第4行中使用了mark(2),则当在第6行调用reset()时,将会抛出IOException,因为标记位置将被无效,因为我们读取超过2个字节.

作者: dawei

【声明】:永州站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部