Java NIO學習筆記(三)Channel

概述:

Channel(通道)在前面也提到過,是NIO的三大組件之一,相當於BIO中的流,不一樣的是,通道是雙向的、可異步的、讀寫必須經過緩衝區的。二流是單向、同步的。

Channel的一些實現:

FileChannel(讀寫文件)
DatagramChannel(UDP)
SocketChannel(TCP客戶端)
ServerSocketChannel(TCP服務器端)

Scatter 分散:

將通道中的數據分散的寫入到Buffer中。


12350543-5501a8a8832f313c.png
Scatter 分散

舉個栗子:
消息頭、消息體。

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

這會將數據按順序寫入,但是不適合傳輸動態消息(因爲大小不固定)

Gather 聚合:

將多個Buffer讀取到一個通道中。


12350543-7d6667fcd81174e0.png
Gather 聚合

舉個栗子:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray = { header, body };

channel.write(bufferArray);

Gather可以傳輸動態的消息。

如果兩個通道中有一個是FileChannel就可以直接從一個通道傳輸到另一個通道
通過transferFrom()、transferTo()方法、但是SocketChannel只能傳輸此刻已經準備好的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章