首页 > 在程序里读取磁盘文件时,为什么需要使用缓冲区。

在程序里读取磁盘文件时,为什么需要使用缓冲区。

java中,读取磁盘文件时,通常都使用BufferedInputStream包装FileInputStream。
但是操作系统内核读取磁盘文件时,不是会将内存作为磁盘文件的缓冲区吗?
那为什么还要在程序里自己使用缓冲区??


因为操作系统要将用户空间和系统空间隔离呀, 以保护数据安全. 准确的说, 操作系统在读取文件的时候是将文件读入系统空间, 然后再拷贝给应用程序进程的用户空间, 也就是题主说的程序自己的缓冲区. 如果让用户进程直接操作系统空间的缓冲区, 操作系统岂不是不安全了.


操作系统不仅会将硬盘上的文件读到内存作为缓存使用,也会在内存开辟另外一段空间给内存的数据做缓存处理。
意义何在? 为了管理,也为了效率。
内存与内存之间的数据交换,比内存与硬盘之间的数据交换速率高了两个数量级。
当内存上的某个进程需要数据的时候,如果内存缓存有匹配的数据,则直接在缓存区取,
如果没有,再去硬盘上读。(写也同理)

Java为IO操作设计缓存的意义,也在于此,
不同的地方在于Java缓存的数据只能被Java的当前运行环境所使用。
与频繁得去跟操作系统的缓存拿数据相比,这提高了执行效率,
尤其是你的代码需要进行频繁的IO操作时,意义就体现出来了。


FileInputStream/FileOutputStream 每次调用 read()/write() 都会触发一个 IO 操作。
BufferedInputStream/BufferedOutputSteam 调用 read()/write() 并不会每次都触发一个 IO 操作,只是写到内部的buffer里面,而只有内部的 buffer 满了或者调用 flush() 才会触发 IO 操作。

IO 操作越少,性能越好。


所谓的缓冲大多是有硬盘的硬件在接口区域封装的,而且缓冲区也不大。操作系统是不会缓存文件内容到内存的。


做IO时JVM会在自己堆空间创建byte数组做buffer,一般用户不能够通过jvm直接调用内存(directbuffer)除外,堆空间buffer和内存交互由JVM管理。这样才能利用JVM优势,比如GC机制,以及java高层封装的API。

【热门文章】
【热门文章】