概述:
Channel(通道)在前面也提到過,是NIO的三大組件之一,相當於BIO中的流,不一樣的是,通道是雙向的、可異步的、讀寫必須經過緩衝區的。二流是單向、同步的。
Channel的一些實現:
FileChannel(讀寫文件)
DatagramChannel(UDP)
SocketChannel(TCP客戶端)
ServerSocketChannel(TCP服務器端)
Scatter 分散:
將通道中的數據分散的寫入到Buffer中。
舉個栗子:
消息頭、消息體。
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);
這會將數據按順序寫入,但是不適合傳輸動態消息(因爲大小不固定)
Gather 聚合:
將多個Buffer讀取到一個通道中。
舉個栗子:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);
Gather可以傳輸動態的消息。
如果兩個通道中有一個是FileChannel就可以直接從一個通道傳輸到另一個通道
通過transferFrom()、transferTo()方法、但是SocketChannel只能傳輸此刻已經準備好的數據。