BufferedInputStream如何从OS请求大块数据

问题描述 投票:1回答:1

[我读了这个问题:Why is using BufferedInputStream to read a file byte by byte faster than using FileInputStream?据作者BufferedInputStream(BIS)认为比FileInputStream(FIS)更快,因为当在read()中调用方法FileInputStream时,它总是使用本地API进行系统调用以获取单个字节,而[ C0]的作用相同,但是它需要OS的字节块并将其存储在称为BufferedInputStream的本地字段中,该字段在BIS类中声明,然后在buf被调用时,BIS从read()数组返回字节。

我查看了BIS的代码,特别是buf方法,当BIS需要字节块而不是一个字节时,它并不清楚何时发生。方法read()首先检查read(),如果是,则调用if (pos >= count)方法,该方法首先检查buf是否已满,如果buf有空间,则InputStream的方法称为fill(),其中b []是我们的缓冲区,并且在通过此方法,我们可以看到它在等于public int read(byte b[], int off, int len) param的循环内进行系统调用。

len

我是否错过了某些事情,或者BIS和FIS类将进行相同数量的系统调用,以便分别获取每个字节?

java io stream
1个回答
1
投票

您在寻找错误的位置。

InputStream提供for (; i < len ; i++) { c = read(); 的实现,该实现确实在循环中调用int read(byte[] b, int off, int len)。因此,如果由BuffredInputStream包装的具体InputStream没有覆盖此方法,则不会提高性能。但是,您链接的问题专门针对FileInputStream,它通过调用read()does覆盖此方法。

© www.soinside.com 2019 - 2024. All rights reserved.