1. 程式人生 > 其它 >[NIO]——(三)通道(Channel)的原理與獲取

[NIO]——(三)通道(Channel)的原理與獲取

一、什麼是通道(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