BufferedInputStream 中的读取方法

Posted

技术标签:

【中文标题】BufferedInputStream 中的读取方法【英文标题】:read mthod in BufferedInputStream 【发布时间】:2022-01-16 05:41:27 【问题描述】:

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

所以我的问题是,普通模式和不使用 BufferedInputStream 和使用缓冲区有什么区别?缓冲区本来应该以块为单位读取字节以降低成本,但这里是逐字节读取。

【问题讨论】:

【参考方案1】:

确实,最简单的具体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 子类使用(例如 java.io.FileInputStream 用于读取文件,java.net.SocketInputStream 用于从网络连接读取,java.util.zip.ZipFile.ZipFileInputStrem 用于从 zip 文件读取数据)确实实现了read(byte b [], int off, int len) 方法。

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


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

【讨论】:

以上是关于BufferedInputStream 中的读取方法的主要内容,如果未能解决你的问题,请参考以下文章

BufferedInputStream读取流正常,但是BufferedInputStream转化为BufferedReader后 就读取不到数据了?求解

FileInputstream --BufferedInputStream字节流读取使用方法

bufferedinputstream的使用

为啥使用 BufferedInputStream 逐字节读取文件比使用 FileInputStream 快?

使用 BufferedInputStream 读取大文件时 Java 文件 IO 被截断

java 比较InputStream,BufferedInputStream,RandomAccessFile,FileChannel的读取速度。