JAVA NIO

一:NIO中的幾個基礎概念 在NIO中有幾個比較關鍵的改建:Channel(通道),Buffer(緩衝區),Selector(選擇器)。 首西安胸Channel提及吧,通道,顧名思義,就是通向什麼樣的道路,爲某個提供了渠道。在傳統IO中,咱們要讀取一個文件中的內容,通常是new FileInputStream(new File(String path))的方法。 這裏new的對象實際上就是爲讀取文件提供的一條通道。 所以能夠將NIO中的Channel同傳統IO中的Stream來類比,可是要注意,傳統IO中,Stream是單向的,好比InputStream只能警醒讀取操做,OutputStream只能進行寫操做。而Channel是雙向的,便可以進行讀操做,又能夠進行寫操做。 Buffer(緩衝區),是NIO中很是重要的一個東西,在NIO中全部的數據的讀和寫都離不開Buffer。好比原始的讀取數據通常都放在byte[]數組中,而在NIO中,讀取的數據只能放在Buffer中。一樣地,寫入的數據也是寫入Buffer中。 Selector(選擇器),是NIO中最核心的一個部分。selector的做用就是用來輪詢(CPU定時發出詢問,依序詢問每個周邊設備是否須要其服務,有即給予服務,服務結束後再問下一個周邊,接着不斷周而復始。要注意的是輪詢法實做容易,但效率偏低)每個註冊的Channel,一旦發現Channel有註冊的事件發生,便獲取事件而後進行處理。 輸入圖片說明 用單線程處理一個Selector,而後通富哦Selector.select()方法獲取到達事件,在獲取到到達時間以後,就能夠逐個地對事件進行響應處理。java

二:Channel 和Stream的區別:通道是雙向的,經過一個Channel便可以進行讀,也能夠進行寫;而Stream只能進行單向操做,經過一個Stream只能進行讀或者寫; 如下是經常使用的集中通道: *FileChannel//從文件讀或者向文件寫入數據 *SocketChannel//以TCP向網絡兩端讀寫數據 *ServerSocketChannel//監聽客戶端發起的TCP鏈接,併爲每一個TCP鏈接穿件一個新的SocketChannel來進行數據讀寫 *DatagramChannel//以UDP協議來向網絡鏈接的兩端讀寫數據 舉例:FileChannel數組

public class Test {
    public static void main(String[] args) throws IOException  {
        File file = new File("data.txt");//建立文件
        FileOutputStream outputStream = new FileOutputStream(file);//定義一個輸出流
        FileChannel channel = outputStream.getChannel();//獲取一個FileChannel
        ByteBuffer buffer = ByteBuffer.allocate(1024);//建立一個字節緩衝區
        String string = "java nio";
        buffer.put(string.getBytes());//將要讀取的數據放入字節緩衝區
        buffer.flip();     //此處必需要調用buffer的flip方法。一般狀況下,在準備從緩衝區中讀取數據時調用flip方法。
        channel.write(buffer);//寫出數據
        channel.close();//關閉通道
        outputStream.close();//關閉輸出流
    }  
}

注意在調用Channel的write方法以前必須調用buffer的flip方法,不然沒法正確寫入內容。網絡

三:Buffer buffer,顧名思義,緩衝區,其實是一個容器,本質爲一個連續數組。Channel提供從文件,網絡讀取數據的渠道,可是讀取或寫入的數據必須經由Buffer。 輸入圖片說明 上面的圖描述了從一個客戶端向服務端發送數據,而後服務端接受數據的過程。客戶端發送數據時,必須先將數據存入Buffer中,而後將Buffer中的內容寫入通道。服務端這邊接受數據必須通富哦Channel將數據讀入到Buffer中,而後再胸Buffer中取出數據處理。 在NIO中,Buffer是一個頂層父類,它是一個抽象類,經常使用的Buffer子類有 *ByteBuffer,IntBuffer,CharBuffer,LongBuffer,DoubleBuffer,FloatBuffer,ShortBuffer函數

四:Selector Selector類是NIO的核心類,Selector可以檢測多個註冊的通道上是否有事件發生,若是有時間發生,便獲取時間而後針對每個時間進行相應的響應處理。這樣一來,只是用一個單線程就能夠管理多個通道,也就是管理多個連接。這樣使得只有在連接真正有讀寫事件發生時,纔會調用函數進行讀寫。這樣大大減小了系統開銷,而且沒必要每個鏈接都穿件一個線程,不用去維護多個線程,而且避免多個線程之間的上下文切換致使的開銷。 與Selector有關的一個關鍵類是Selectionkey,一個SelectionKey標識一個到達的事件,這2個構成了服務端處理業務的關鍵邏輯。線程

相關文章
相關標籤/搜索