BufferedInputStream 中的读取方法

read mthod in BufferedInputStream

我在一个教程中看到 BufferedInputStream 中的 int read(byte b[], int off, int len) class本身使用read()方法读取数据。

所以我的问题是,正常模式和不使用BufferedInputStream和使用缓冲区有什么区别? buffer本来是按块读取字节来降低成本的,但是这里是一个字节一个字节地读取。

确实最简单的具体InputStream只需要实现只读一个字节的方法(即InputStream.read()方法)

对于这样的底层 InputStream 使用 BufferedInputStream 也确实没有任何性能优势,因为 BufferedInputStream.read(byte b [], int off, int len) 依赖于 InputStream.read(byte b [], int off, int len) 其中(在 InputStream) 取决于 InputStream.read() 方法。

不过

许多(大多数)“典型”InputStream sub类 被使用(例如 java.io.FileInputStream 用于读取文件,java.net.SocketInputStream 用于从网络连接读取, java.util.zip.ZipFile.ZipFileInputStrem 用于从 zip 文件中读取数据)执行 read(byte b [], int off, int len) 方法。

对于所有这些 InputStream sub类 使用 BufferedInputStream 在读取单个字节(即调用 read() 方法)时提供了巨大的性能优势,因为这些 类 执行系统调用以获取单个字节 (FileInputStream),其他分配一个长度为 1 的字节数组并调用 read(byte[] b)(进而调用 read(b, 0, b.length))以读取一个单字节 (SocketInputStream, ZipFileInputStream).


注意:我用作查找 InputStream sub类 的基础的项目有 326 个不同的 InputStream sub类。我没有检查每一个来决定 BufferedInputStream 是否对他们有益,我只是检查了我倾向于使用的那几个。