Java NIO的通道類似流,但又有些不同:
- 既可以從通道中讀取數據,又可以寫數據到通道。但流的讀寫通常是單向的。
- 通道可以異步地讀寫。
- 通道中的數據總是要先讀到一個Buffer,或者總是要從一個Buffer中寫入。
正如上面所說,從通道讀取數據到緩衝區,從緩衝區寫入數據到通道。如下圖所示:
Channel的實現
這些是Java NIO中最重要的通道的實現:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel 從文件中讀寫數據。
DatagramChannel 能通過UDP讀寫網絡中的數據。
SocketChannel 能通過TCP讀寫網絡中的數據。
ServerSocketChannel可以監聽新進來的TCP連接,像Web服務器那樣。對每一個新進來的連接都會創建一個SocketChannel。
基本的 Channel 示例
下面是一個使用FileChannel讀取數據到Buffer中的示例:
01 |
RandomAccessFile
aFile = new RandomAccessFile( "data/nio-data.txt" , "rw" ); |
02 |
FileChannel
inChannel = aFile.getChannel(); |
04 |
ByteBuffer
buf = ByteBuffer.allocate( 48 ); |
06 |
int bytesRead
= inChannel.read(buf); |
07 |
while (bytesRead
!= - 1 )
{ |
09 |
System.out.println( "Read
" +
bytesRead); |
12 |
while (buf.hasRemaining()){ |
13 |
System.out.print(( char )
buf.get()); |
17 |
bytesRead
= inChannel.read(buf); |
注意 buf.flip() 的調用,首先讀取數據到Buffer,然後反轉Buffer,接着再從Buffer中讀取數據。下一節會深入講解Buffer的更多細節。