原文連線 Java NIO Channel
Java NIO Channels 和流非常類似,但還是有一些小的區別。
-
Channels
是可讀和可寫的,流一般都是單向的(讀或寫 )。 -
Channels
可以以非同步的方式讀或者寫。 -
Channels
通 常讀取或者寫入緩衝區。
如上所述,你可以從 channel
讀取資料寫入到 buffer
,或者從 buffer
讀取資料寫入到 channel
。下面是一個示意圖。
Channel 的實現(Channel Implementations)
下面是 Java NIO 中比較重要的 Channel
的實現類的列表:
-
FileChannel
負責檔案讀寫。 -
DatagramChannel
用於在網路上的以 UDP 方式的資料讀寫。 -
SocketChannel
用於在網路上的以 TCP 方式的資料讀寫。 -
ServerSocketChannel
用於監聽 TCP 連線,類似於 web 服務,為每一個連線建立對應的SocketChannel
。
基礎的管道示例( Basic Channel Example)
這是一個使用 FileChannel
讀取資料到 Buffer
中的例子。
RandomAccessFile aFile =
new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {
System.out.println("Read " + bytesRead);
buf.flip();
while (buf.hasRemaining()) {
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
複製程式碼
注意 buf.flip()
,首先讀取資料到 Buffer
中,然後通過 buf.flip()
方法翻轉它,就可以從裡面把資料讀取出來了。我會在下面章節結介紹更多的細節。