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:將多個緩衝區的數據聚集到通道中