6

当我使用 FileInputStream 读取对象(比如几个字节)时,底层操作是否涉及:

1)读取整个磁盘,以便如果我随后执行另一个读取操作,它不需要真正的磁盘读取,因为文件的那部分已经在上次读取操作中获取?

或者

2) 因为FileInputStream 没有做任何缓冲,而应该使用bufferedInputStream 来实现(1) 的效果,所以发生了新的磁盘访问?

我认为由于 FileInputStream 使用 read 系统调用并且它只从硬盘读取一组页面,因此必须进行一些缓冲。

4

3 回答 3

7

FileInputStream将进行底层本机系统调用。大多数操作系统会为此做自己的缓冲。所以它不需要为每个字节进行真正的磁盘查找。但是,您仍然需要进行本机操作系统调用的成本,这很昂贵。所以 BufferedStream 会更好。但是,对于读取少量数据(就像您说的,几个字节甚至 kBs),任何一个都应该没问题,因为操作系统调用的数量不会那么不同。

于 2011-09-14T18:26:22.267 回答
5

FileInputStream 的本机代码在这里:看起来那里没有任何缓冲。操作系统缓冲可能会启动,但如果/何时发生这种情况,并没有明确的指示。

于 2011-09-14T18:25:09.607 回答
1

需要注意的一件事是通过慢速连接从已安装的网络卷中读取。为此,我使用非缓冲 FileInputStream 遇到了一个很大的性能问题。在开发中没有发现它,因为文件系统是本地的。

于 2011-09-14T18:44:29.107 回答