定義:
Channel:通道,運輸的介質,可以大致比喻成鐵路的鐵軌,連接着兩個車站,而channel用於打開與IO設備的連接,比如磁盤,套接字等。
通道使用完需要關閉。
與傳統IO的Stream比較:
- NIO通道可以異步讀寫,而傳統IO的Stream不能。
- NIO通道本身不存儲數據,只是打開與IO設備之間的連接,所以通道必須要與可以存儲數據的緩衝區配合使用。讀入時,把IO設備上的數據通過通道讀取到緩衝區Buffer上(在緩衝區看來處於寫模式,因爲是在給緩衝區寫入數據)。寫出時,讀取緩衝區的數據並把數據通過通道寫出到IO設備中。
- 通道是雙向的,通過通道,既可以讀取,也可以寫入。
傳統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方法。