FileInputStream是否已使用缓冲区?

时间:2011-09-14 18:14:56

标签: java io disk fileinputstream

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

1)读取磁盘的整个,这样如果我随后再进行一次读取操作,它就不需要真正的磁盘读取,因为在上一次读取操作中已经取出了该部分文件?

OR

2)由于FileInputStream不进行任何缓冲而应该进行新的磁盘访问,而应该使用bufferedInputStream来实现(1)的效果?

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

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