java IO 底层原理 - JiyangM/spring GitHub Wiki
https://www.cnblogs.com/crazymakercircle/p/10225159.html
https://www.jianshu.com/p/007052ee3773
为什么要使用NIO 企业级应用效率是关键。而CPU已不再是的束缚,效率主要消耗在IO上。java.io类则喜欢一铲子一铲子地加工数据。而操作系统喜欢整卡车地运来数据,有了NIO,就可以轻松地把一卡车数据备份到您能直接使用的地方(ByteBuffer对象)。
IO的常用概念 IO操作:向操作系统发出请求,把数据移出和移入缓冲区。 用户空间:是常规进程所在区域。JVM就是常规进程,驻守于用户空间。用户空间是非特权区域:比如,在该区域执行的代码就不能直接访问硬件设备。硬件通常不能直接访问用户空间。 内核空间:它能与设备控制器通讯,控制着用户区域进程的运行状态等等。最重要的是,所有I/O都直接或间接通过内核空间。在数据往来于用户空间与存储设备的过程中,内核负责数据的分解、再组合工作,因此充当着中间人的角色。 虚拟内存:意为使用虚假(或虚拟)地址取代物理(硬件RAM)内存地址 通道(Channel):Channel用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据。 Socket:用于描述IP地址和端口。socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。 DMA(Direct Memory Access,直接内存存取) 他允许不同速度的硬件装置来沟通. 内存分页:将一个页面分成两个或两个以上的页面。其中几个装入内存,其余存储于磁盘。
1.io是面向流的,也就是读取数据的时候是从流上逐个读取,所以数据不能进行整体以为,没有缓冲区;nio是面向缓冲区的,数据是存储在缓冲区中,读取数据是在缓冲区中进行,所以进行数据的偏移操作更加方便
Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。
面向流与面向缓冲
Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。