java - 在程序里读取磁盘文件时,为什么需要使用缓冲区。
伊谢尔伦
伊谢尔伦 2017-04-17 17:44:56
0
6
926

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

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

Antworte allen(6)
Peter_Zhu

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

伊谢尔伦

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。

洪涛

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

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

小葫芦

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

巴扎黑

因为你的硬盘不够快!

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!