1. 程式人生 > >Java I/O總結(二)NIO

Java I/O總結(二)NIO

數據 keys 如果 等待 都是 int har 接口 key

I/O的同步異步,阻塞非阻塞:

阻塞:當執行的操作所需的數據還沒準備好時,線程進行等待

非阻塞:當數據還沒準備好時,線程不等待

同步:執行操作,一直等操作執行完才向下執行

異步:執行操作,調用接口後不用等待,向下執行

常用的 read() write() 方法都是同步I/O

傳統的I/O是阻塞式的。

問題在於:當操作所需的數據沒有準備好,如數據沒有到達,線程會一直等待。

為了解決這一問題,引入了NIO概念:同步非阻塞I/O.

NIO相當於定義一個調度器selector,把所有實現通信的信道channel註冊到selector,由它調度各個信道的運行情況,實現各個信道不發生阻塞地傳輸。

Channel

FileChannel

DatagramChannel(UDP)SocketChannel(TCP)ServerSocketChannel(TCP)

這些通道涵蓋了UDP TCP 網絡IO,以及文件IO

Buffer:(有三個參數,容量capacity,當前存儲位置position,上界limit

寫模式下,limit等於capacity;讀模式下,limit等於position

ByteBufferCharBufferDoubleBufferFloatBufferIntBufferLongBufferShortBuffer

這些Buffer覆蓋了你能通過IO發送的基本數據類型:byte, short, int, long, float, double

char

Java NIO 還有個 MappedByteBuffer,用於表示內存映射文件。

Selector(可以比為一個調度工具)

Selector允許單線程處理多個 Channel

用於向 buffer 提供數據或者讀取 buffer 數據 ,buffer 對象的唯一接口。

1. 創建selectorchannel,把channel信道設為非阻塞模式

2. 綁定socket對象到channel

3. channel註冊到selector

4. 調用selectorselectedKeys檢查所有信道是否有需要的事情發生,如果有事情發生,返回所有的channel對象。

5. 通過信道,讀取通信的數據,讀取的是

buffer


Java I/O總結(二)NIO