84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
java中,读取磁盘文件时,通常都使用BufferedInputStream包装FileInputStream。但是操作系统内核读取磁盘文件时,不是会将内存作为磁盘文件的缓冲区吗?那为什么还要在程序里自己使用缓冲区??
小伙看你根骨奇佳,潜力无限,来学PHP伐。
因为操作系统要将用户空间和系统空间隔离呀, 以保护数据安全. 准确的说, 操作系统在读取文件的时候是将文件读入系统空间, 然后再拷贝给应用程序进程的用户空间, 也就是题主说的程序自己的缓冲区. 如果让用户进程直接操作系统空间的缓冲区, 操作系统岂不是不安全了.
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操作时,意义就体现出来了。
所谓的缓冲大多是有硬盘的硬件在接口区域封装的,而且缓冲区也不大。操作系统是不会缓存文件内容到内存的。
因为你的硬盘不够快!
因为操作系统要将用户空间和系统空间隔离呀, 以保护数据安全. 准确的说, 操作系统在读取文件的时候是将文件读入系统空间, 然后再拷贝给应用程序进程的用户空间, 也就是题主说的程序自己的缓冲区. 如果让用户进程直接操作系统空间的缓冲区, 操作系统岂不是不安全了.
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操作时,意义就体现出来了。
所谓的缓冲大多是有硬盘的硬件在接口区域封装的,而且缓冲区也不大。操作系统是不会缓存文件内容到内存的。
因为你的硬盘不够快!