FileInputStream是否已经使用了缓冲区?

6
当我使用FileInputStream读取一个对象(比如几个字节)时,底层操作是否涉及到:
1)读取整个磁盘块,以便在后续进行另一个读取操作时,不需要真正的磁盘读取,因为文件的那一部分已经在上次读取操作中获取了?
还是
2)需要进行新的磁盘访问,因为FileInputStream不做任何缓冲,应该使用BufferedInputStream来实现(1)的效果?
我认为由于FileInputStream使用read系统调用,它只从硬盘读取一组页面,因此一定会发生一些缓存。

1
我不太了解底层操作系统的IO,无法回答这个问题,但缓冲并不是避免多次调用的唯一原因。每个读取操作还涉及对本地方法的调用,这会带来一些开销。因此,减少本地方法调用的次数也是有用的。 - JB Nizet
尝试进行简单的基准测试,你可能会注意到一些改进。 - Lynch
3个回答

7

FileInputStream 会发出底层的本地系统调用。大多数操作系统都会为此进行自己的缓存处理。因此,它不需要为每个字节进行真正的磁盘查找操作。但是,您仍然需要支付进行本机操作系统调用的成本,这是昂贵的。因此,使用 BufferedStream 更好。然而,对于读取少量数据(就像你说的,几个字节甚至几千字节),两种方法均可,因为OS调用的次数不会有太大区别。


5

FileInputStream的本地代码在这里:它似乎没有任何缓冲。操作系统缓冲区可能会启动,但是没有明确的指示器表明何时发生。


谢谢你提供程序员参考。看起来L65和L70是相关的。 你知道readSingle()在哪里实现吗?它不是系统调用。 - Heinrich Hartmann

1
需要注意的一件事是在慢速连接上从已挂载的网络卷中读取数据。我曾经因为使用非缓冲的FileInputStream而遇到了性能问题。在开发过程中没有发现这个问题,因为文件系统是本地的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接