Java I/O總結(二)NIO
阻塞:當執行的操作所需的數據還沒準備好時,線程進行等待
非阻塞:當數據還沒準備好時,線程不等待
同步:執行操作,一直等操作執行完才向下執行
異步:執行操作,調用接口後不用等待,向下執行
常用的 read() 和 write() 方法都是同步I/O。
傳統的I/O是阻塞式的。
問題在於:當操作所需的數據沒有準備好,如數據沒有到達,線程會一直等待。
為了解決這一問題,引入了NIO概念:同步非阻塞I/O.
NIO相當於定義一個調度器selector,把所有實現通信的信道channel註冊到selector,由它調度各個信道的運行情況,實現各個信道不發生阻塞地傳輸。
Channel:
FileChannel、
這些通道涵蓋了UDP 和 TCP 網絡IO,以及文件IO。
Buffer:(有三個參數,容量capacity,當前存儲位置position,上界limit)
寫模式下,limit等於capacity;讀模式下,limit等於position;
ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer
這些Buffer覆蓋了你能通過IO發送的基本數據類型:byte, short, int, long, float, double
Java NIO 還有個 MappedByteBuffer,用於表示內存映射文件。
Selector(可以比為一個調度工具)
Selector允許單線程處理多個 Channel,
用於向 buffer 提供數據或者讀取 buffer 數據 ,buffer 對象的唯一接口。
1. 創建selector,channel,把channel信道設為非阻塞模式
2. 綁定socket對象到channel
3. 把channel註冊到selector上
4. 調用selector的selectedKeys檢查所有信道是否有需要的事情發生,如果有事情發生,返回所有的channel對象。
5. 通過信道,讀取通信的數據,讀取的是
Java I/O總結(二)NIO