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協議來向網絡連接的兩端讀寫數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM