Java NIO通道跟流類似,但有以下不同之處。
- 通道可以同時讀寫,但流只是單向的。
- 通道可以非同步地進行讀寫。
- 通道都是從快取中進行讀或寫操作的。
正如以上所提到的,你可以將資料從Channel寫入到Buffer,也可以將資料從Buffer讀取寫入到Channel,如下圖中所示。
Channel 實現
Channel的主要實現類有以下幾種
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel負責從檔案中進行讀寫資料。
DatagramChannel負責從UDP網路中讀寫資料。
SocketChannel負責從TCP網路中讀寫資料。
ServerSocketChannel可以監聽指定的TCP連線,像一個Web伺服器那樣。對於每一個建立的連線會建立一個新的SocketChannel。
Channel基本使用例子
以下是一個使用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中,然後你flip它,並讀取buf中的資料。該方法將在後面Buffer的章節中進行詳細介紹。