Java NIO 通道(Channels )與流類似但也有一些區別:
- 您可以讀取和寫入通道,流通常是單向的(讀或寫)。
- 通道可以異步讀寫。
- 通道總是讀取或寫入緩沖區。
如上所述,你將數據從通道讀入緩沖區,并將數據從緩沖區寫入通道。這里有一個例子:
**Java NIO: 通道將數據讀入緩沖區,緩沖區將數據寫入通道**
通道(Channel)的實現
這里是 Java NIO 中最重要的通道實現:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel 從文件中讀取數據并寫到文件中去。
DatagramChannel 可以通過 UDP 在網絡上讀寫數據。
SocketChannel 可以通過 TCP 在網絡上讀寫數據。
ServerSocketChannel 允許你監聽傳入的TCP連接,就像Web服務器那樣。對于每個傳入連接,創建 SocketChannel。
基本的管道(Channel )示例
這里是一個使用 FileChannel 讀取一些數據到緩沖區的基本示例:
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。然后你翻轉它。然后你讀出來。我將在下面關于 Buffer 的文本中詳細介紹。