IO跟NIO的區別

IO跟NIO的區別

1. 面向流跟面向緩存

1.1 面向流意味着每次只能從流中一個或多個字節的讀取,直至讀完,沒有被緩存到任何地方緩存

1.2 Java NIO提供了channel,Channel和傳統的io中的stream很類似,但也有很大區別,主要區別 就是通道是雙向的,經過channel能讀也能寫,它將數據讀取到一個稍後處理的緩衝區,須要的時候可在緩衝區先後移動,這就增長了處理過程當中的靈活性。可是還須要檢查該緩衝區是否有所須要的數據,並且確保新添加的數據不會覆蓋緩衝區還沒有處理的數據。網絡

2. 阻塞與非阻塞

2.1 io的各類流是阻塞的,就是當一個線程調用讀寫方法時,該線程會被阻塞,直到讀寫完,在這期間該線程不能幹其餘事,CPU轉而去處理其餘線程,假如一個線程監聽一個端口,一天只會有幾回請求進來,可是CPU卻不得不爲該線程不斷的作上下文切換,而且大部分切換以阻塞了結。多線程

2.2 NIO通信是將整個任務切換成許多小任務,由一個線程負責處理全部io事件,並負責分發。它是利用事件驅動機制,而不是監聽機制,事件到的時候再觸發。NIO線程之間經過wait,notify等方式通信。保證了每次上下文切換都有意義,減小無謂的進程切換。函數

3. IO選擇器(selector)

Selector類是NIO的核心類,經過Selector類來檢測多個通道是否有事件發生,若是有就獲取事件並對事件進行響應處理。這樣就能夠經過一個單線程來管理多個通道,這樣只有在通道真正有讀寫事件發生的時候,纔會調用函數進行讀寫,避免多線程之間的上下文切換致使的開銷。線程

4. 通道channel

在前面已經提到,Channel和傳統IO中的Stream很類似。雖然很類似,可是有很大的區別,主要區別爲:通道是雙向的,經過一個Channel既能夠進行讀,也能夠進行寫;而Stream只能進行單向操做,經過一個Stream只能進行讀或者寫;
如下是經常使用的幾種通道:
FileChannel
SocketChanel
ServerSocketChannel
DatagramChannel
  經過使用FileChannel能夠從文件讀或者向文件寫入數據;經過SocketChannel,以TCP來向網絡
鏈接的兩端讀寫數據;經過ServerSocketChanel可以監聽客戶端發起的TCP鏈接,併爲每一個TCP鏈接建立一個新的SocketChannel來進行數據讀寫;經過DatagramChannel,以UDP協議來向網絡鏈接的兩端讀寫數據。進程

相關文章
相關標籤/搜索