[我读了这个问题: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类将进行相同数量的系统调用,以便分别获取每个字节?
您在寻找错误的位置。
InputStream提供for (; i < len ; i++) {
c = read();
的实现,该实现确实在循环中调用int read(byte[] b, int off, int len)
。因此,如果由BuffredInputStream包装的具体InputStream没有覆盖此方法,则不会提高性能。但是,您链接的问题专门针对FileInputStream,它通过调用read()
来does覆盖此方法。