Java磁盘数据读取模型
数据存在磁盘中,磁盘控制器从磁盘中读取将其放入操作系统内核的缓冲区,然后Java程序从缓冲区中读取数据
由于现在CPU处理速度的上升,整体的运行速度瓶颈已不在CPU,更多的是由I/O效率决定,而目前市面上所有操作系统已经将I/O性能改善到非常OK不会拖后腿,但由于Java虚拟机为了提供一个多系统统一的环境,其单方面屏蔽了操作系统在I/O上处理的优化。
是JVM在I/O方面效率不足,导致的程序效率降低。在操作系统中,可以从硬件上直接读取大块的数据,而JVM只能从这些大块的里面一小块一小块的读。
在JDK4中引入了NIO,最大限度满足Java的I/O需求。
BIO和NIO的区别
BIO
面向流,每次可以从流中读取一个或多个字节,只能向后读取,不能向前移动
BIO是线程阻塞的,在read() / write()读写数据时,线程阻塞,直到数据读取完毕,在读写过程中,线程只能等,什么也做不了。
NIO
面向缓冲区,把数据读到一个缓冲区,可以在缓冲区中向前、向后移动;
所有数据通过Channel传输,Channel可以直接将一块数据映射到内存中,Channel是双向的,可以读取数据,也能保存数据,Channel只能与Buffer缓冲区交互,不能直接读取数据。
NIO是线程非阻塞的,当线程从Channel中读取数据时,如果Channel中没有数据,线程不用一直在这等,可以去做别的。
待续