參考:http://ifeve.com/channels/
原文地址
目錄
- Java NIO教程
- Java NIO 教程(一) 概述
- Java NIO 教程(二) Channel
- Java NIO 教程(三) Buffer
- Java NIO 教程(四) Scatter/Gather
- Java NIO 教程(五) 通道之間的數據傳輸
- Java NIO 教程(六) Selector
- Java NIO 教程(七) FileChannel
- Java NIO 教程(八) SocketChannel
- Java NIO 教程(九) ServerSocketChannel
- Java NIO 教程(十) 非阻塞式服務器
- Java NIO 教程(十一) Java NIO DatagramChannel
- Java NIO 教程(十二) Pipe
- Java NIO 教程(十三) Java NIO vs. IO
- Java NIO 教程(十四) Java NIO Path
- Java NIO 教程(十五) Java NIO Files
- Java NIO 教程(十六) Java NIO AsynchronousFileChannel
Java NIO的通道類似流,但又有些不同:
- 既可以從通道中讀取數據,又可以寫數據到通道。但流的讀寫通常是單向的。
- 通道可以異步地讀寫。
- 通道中的數據總是要先讀到一個Buffer,或者總是要從一個Buffer中寫入。
正如上面所說,從通道讀取數據到緩沖區,從緩沖區寫入數據到通道。如下圖所示:
NIO 數據讀寫流程
Channel的實現
這些是Java NIO中最重要的通道的實現:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
-
FileChannel
從文件中讀寫數據。 -
DatagramChannel
能通過UDP讀寫網絡中的數據。 -
SocketChannel
能通過TCP讀寫網絡中的數據。 -
ServerSocketChannel
可以監聽新進來的TCP連接,像Web服務器那樣。對每一個新進來的連接都會創建一個SocketChannel
。
基本的 Channel 示例
下面是一個使用FileChannel
讀取數據到Buffer
中的示例:
private static void useNio(){
RandomAccessFile aFile = null;
try {
aFile = new RandomAccessFile("/Users/sschen/Documents/SerialVersion.txt", "rw");
FileChannel inChannel = aFile.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(48);
int byteReader = inChannel.read(byteBuffer);
while (byteReader != -1) {
System.out.println("Read:" + byteReader);
byteBuffer.flip();
while (byteBuffer.hasRemaining()) {
System.out.println((char)byteBuffer.get());
}
byteBuffer.clear();
byteReader = inChannel.read(byteBuffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
aFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意 buf.flip()
的調用,首先讀取數據到Buffer
,然后反轉Buffer
,接著再從Buffer
中讀取數據。下一節會深入講解Buffer的更多細節。