我在一个教程中看到,BufferedInputStream类中的int 读取(字节b []、int off、int len)本身使用read()方法读取数据。
因此,我的问题是,正常模式和不使用BufferedInputStream与使用缓冲区有什么区别?缓冲区应该以块形式读取字节,以降低成本,但这里是逐字节读取字节。
发布于 2021-12-12 13:24:15
确实,只需要实现读取单个字节的方法(即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、从zip文件读取数据的java.util.zip.ZipFile.ZipFileInputStrem )都实现了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是否对他们有好处,我只是检查了我倾向于使用的那几个。
https://stackoverflow.com/questions/70322996
复制相似问题