Java NIO學習篇之通道Channel詳解

定義:

Channel:通道,運輸的介質,可以大致比喻成鐵路的鐵軌,連接着兩個車站,而channel用於打開與IO設備的連接,比如磁盤,套接字等。

通道使用完需要關閉。

與傳統IO的Stream比較:

  1. NIO通道可以異步讀寫,而傳統IO的Stream不能。
  2. NIO通道本身不存儲數據,只是打開與IO設備之間的連接,所以通道必須要與可以存儲數據的緩衝區配合使用。讀入時,把IO設備上的數據通過通道讀取到緩衝區Buffer上(在緩衝區看來處於寫模式,因爲是在給緩衝區寫入數據)。寫出時,讀取緩衝區的數據並把數據通過通道寫出到IO設備中。
  3. 通道是雙向的,通過通道,既可以讀取,也可以寫入。

在這裏插入圖片描述

傳統IO是用DMA直接存儲器進行IO處理的,每當一個IO請求來臨,操作系統就會向CPU申請資源,建立一條DMA總線來對該IO請求進行處理,然後CPU就不負責該IO操作了,但是每次一個IO請求到來時,都得向cpu申請資源。並且如果應用程序發起來太多的IO操作後,建立過多的DMA總線後,會造成總線衝突。

在這裏插入圖片描述
通道是一個完全獨立的處理器,專門用於IO操作,擁有一套自己的命令,但是也附屬於cpu。當IO請求來臨時,無需向cpu申請資源。可以節省更多的CPU資源去處理其他請求。

在這裏插入圖片描述

Channel的實現:

java.nio.channels.Channel是一個接口,他有一些常用的實現類:

  • FileChannel: 從文件讀寫數據的channel。
  • DatagramChannel: 通過UDP協議讀寫網絡中的信號。
  • SocketChannel:通過TCP協議讀寫網絡中的Channel。
  • ServerSocketChannel:監聽一個TCP連接,對於每一個新的客戶端連接都創建一個SocketChannel。

獲取通道的方式:

1.java針對支持通道的類提供了getChannel方法來獲取通道:
a) 本地IO:獲取的是FileChannel

  • fileInputStream.getChannel();
  • fileOutputStream.getChannel();
  • randomAccessFile.getChannel();

b)網絡IO:

  • socket.getChannel(); //獲取的是SocketChannel
  • serverSocket.getChannel(); //獲取的是ServerSocketChannel
  • datagramSocket.getChannel(); //獲取的是DatagramChannel

2.JDK1.7以後各通道提供了靜態方法open方法。
3.JDK1.7以後Files工具類提供newByteChannel方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章