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)
)来读取单个字节(SocketInputStream
,ZipFileInputStream
)。
注意:我用作查找InputStream
子类的基础项目有326 个不同的InputStream
子类。我没有检查每一个来确定BufferedInputStream
是否对他们有益,我只是检查了我倾向于使用的那几个。
【讨论】:
以上是关于BufferedInputStream 中的读取方法的主要内容,如果未能解决你的问题,请参考以下文章
BufferedInputStream读取流正常,但是BufferedInputStream转化为BufferedReader后 就读取不到数据了?求解
FileInputstream --BufferedInputStream字节流读取使用方法
为啥使用 BufferedInputStream 逐字节读取文件比使用 FileInputStream 快?
使用 BufferedInputStream 读取大文件时 Java 文件 IO 被截断
java 比较InputStream,BufferedInputStream,RandomAccessFile,FileChannel的读取速度。