Java NIO系列教程(二) Channel

喝水會長肉發表於2021-12-03

Java NIO的通道類似流,但又有些不同:

  • 既可以從通道中讀取資料,又可以寫資料到通道。但流的讀寫通常是單向的。

  • 通道可以非同步地讀寫。

  • 通道中的資料總是要先讀到一個Buffer,或者總是要從一個Buffer中寫入。

正如上面所說,從通道讀取資料到緩衝區,從緩衝區寫入資料到通道。如下圖所示:


Channel的實現

這些是Java NIO中最重要的通道的實現:

  • 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 ( ) ;
//java學習交流:737251827  進入可領取學習資源及對十年開發經驗大佬提問,免費解答!
while (buf . hasRemaining ( ) ) {

 System .out . print ( (char ) buf . get ( ) ) ;

}

buf . clear ( ) ;

bytesRead = inChannel . read (buf ) ;

}

aFile . close ( ) ;

注意 buf.flip() 的呼叫,首先讀取資料到Buffer,然後反轉Buffer,接著再從Buffer中讀取資料。下一節會深入講解Buffer的更多細節。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2845618/,如需轉載,請註明出處,否則將追究法律責任。

相關文章