NIO和IO的区别
IO | NIO |
---|---|
面向流 | 面向缓冲区 |
阻塞IO | 非阻塞IO |
选择器(selectors) |
一、 java NIO系统的核心在于:管道和缓冲区。通告表示打开到IO设备的连接。若需要使用NIO系统,需要获取用于连接IO设备的通道以及用于容纳数据的缓冲区,然后操作缓冲区,对数据进行处理。
-
缓冲区:在Java NIO中负责数据的存取。缓冲区就是数组,拥有存储不同数据类型的数据
根据数据类型不同(除了boolean之外),提供相应类型的缓冲区
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区 -
缓冲区存取数据的两个核心方法;
· put() :存入数据到缓冲区
· get(): 获取缓冲区的数据
/*
byte中的几个属性
position<= limit <= capacity.
*/
//标记,表示记录当前position的位置,可以通过reset()恢复到Mark位置
private int mark = -1;
//位置,表示缓冲区中正在进行操作的数据的位置
private int position = 0;
//界限:表示缓冲区中可以操作数据的大小,limit后的数据不能进行读写
private int limit;
//容量:表示缓冲区中最大存储数据容量,一旦声明不能修改
private int capacity;
- 直接缓冲区与非直接缓冲区
非直接缓冲区:通过allocate()方法分配缓冲区 ,将缓冲区建立在jvm的内存中;
直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中;在某种情况下可以提高效率;
了解:用户地址空间和内核地址空间 直接缓冲区的实质就是采用一个物理内存映射文件来取消用户地址空间和内核地址空间之间的复制
直接缓冲区缺点:不容易控制 写入到内存后就不受操作软件控制而是由操作系统控制;
二 、 通道(channel):channel表示IO源与目标打开的连接。channel类似于传统的流,只不过channel本身不能直接进行访问数据,channel只能与buffer进行交互。
-
通到的主要实现类:
java.nio.channels.Channel接口:
| - - FileChannel----文件IO
| - - SocketChannel----网络IO
| - - ServerSocketChannel----网络IO
| - - DatagarmChannel----网络IO -
获取通道:
· Java针对支持通道的类提供了getChannel()方法
本地IO:FileInputStream/FileOutputStream
RandomAccessFile网络IO:
Socket
ServerSocket
DatagramSocket·在JDK1.7中的NIO.2 针对各个通道提供了一个静态方法open();
·在JDK1.7中的NIO.2的files工具类的newByteChannel(); -
通道之间的数据传输:
transferFrom();
transferTo();
- 分散(scatter)和聚集(Gather)
分散读取Scattering Reads:将通道中的数据分散到多个缓冲区
聚集写入Gathering Writes:将多个缓冲区的数据聚集到通道中