一、什么是通道(Channel):
1、通道(Channel)一般用於表示源節點與目標節點的連接。在 JAVA NIO中負責緩沖區中數據的傳輸。
2、通道(Channel)本身不存儲數據,因此需要配合緩沖區進行傳輸。

3、最初的操作系統中我們應用程序調用計算機底層的IO接口時,所有的請求都要交給CPU來處理,所有的IO操作都是交給CPU來獨立負責的。
這樣進行大量讀寫操作時,對於CPU的占用率會變得特別高。

4、后面的操作系統經過改進,在內存與IO接口中間弄了一個DMA(直接存儲器),這時我們應用程序向操作系統發起讀寫的IO請求時,
DMA(直接存儲器)會向CPU申請權限,申請下來權限后,這些IO操作都交給DMA(直接存儲器)全權負責。這樣的好處是,
CPU在進行讀寫請求的過程中,CPU不再需要進行干預了。 傳統的數據傳輸方式就是這種DMA(直接存儲器),也就是我們所說的IO流就是這種形式。
但是仍然還是有一個問題,如果我們應用程序發起大量的讀寫請求時,這時候DMA(直接存儲器)也會去向CPU申請權限,然后去建立很多個DMA總線,
這時如果DMA總線過多,就會造成一個總線沖突的問題。如果總線沖突也會十分的影響性能。

5、后來DMA(直接存儲器)也有了更新,更新成了Channel(通道)的形式,當然DMA還是存在的。通道是一個完全獨立的處理器,
專門用於IO操作,雖然他是處理器,但是仍然是附屬於CPU,相較於原來的DMA(直接存儲器)他是完全獨立的處理器,
擁有一套自己的命令 。這時如果從應用程序來了大量的IO請求,它也不再需要去向CPU申請了,也就是讓IO操作與CPU徹底的斷絕關系了。
二、通道(Channel)的主要實現類有哪些:
java.nio.channels.Channel 接口:
|-- FileChannel
|-- SocketChannel
|-- ServerSocketChannel
|-- DatagramChannel
三、如何獲取通道(Channel):
1、Java 針對支持通道的類提供了 getChannel() 方法:
本地IO:
(1) FileInputStream
(2) FileOutputStream
(3) RandomAccessFile
網絡IO:
(1) Socket
(2) ServerSocket
(3) DatagramSocket
2、在JDK 1.7以上版本中的 NIO.2 針對各個通道提供了靜態方法open() 。
3、在JDK 1.7以上版本中的 NIO.2 的Files 工具類的 newByteChannel() 。
隨筆筆記整理於尚硅谷視頻。視頻地址:https://www.bilibili.com/video/BV14W411u7ro