登录

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

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

# Java
伊谢尔伦伊谢尔伦2048 天前590 次浏览

全部回复(6) 我要回复

  • 天蓬老师

    天蓬老师2017-04-17 17:46:56

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

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:46:56

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

    IO 操作越少,性能越好。

    回复
    0
  • 高洛峰

    高洛峰2017-04-17 17:46:56

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

    回复
    0
  • PHP中文网

    PHP中文网2017-04-17 17:46:56

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

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

    回复
    0
  • 高洛峰

    高洛峰2017-04-17 17:46:56

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

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:46:56

    因为你的硬盘不够快!

    回复
    0
  • 取消回复发送