當前位置:編程學習大全網 - 編程語言 - java中IO和NIO的區別和適用場景

java中IO和NIO的區別和適用場景

java.NIO包裏包括三個基本的組件

l?buffer:因為NIO是基於緩沖的,所以buffer是最底層的必要類,這也是IO和NIO的根本不同,雖然stream等有buffer開頭的擴展類,但只是流的包裝類,還是從流讀到緩沖區,而NIO卻是直接讀到buffer中進行操作。

因為讀取的都是字節,所以在操作文字時,要用charset類進行編解碼操作。

l?channel:類似於IO的stream,但是不同的是除了FileChannel,其他的channel都能以非阻塞狀態運行。FileChannel執行的是文件的操作,可以直接DMA操作內存而不依賴於CPU。其他比如socketchannel就可以在數據準備好時才進行調用。

l?selector:用於分發請求到不同的channel,這樣才能確保channel不處於阻塞狀態就可以收發消息。

面向流與面向緩沖

Java NIO和IO之間第壹個最大的區別是,IO是面向流的,NIO是面向緩沖區的。?Java

IO面向流意味著每次從流中讀壹個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方。此外,它不能前後移動流中的數據。如果需要前後移動從流中讀取的數據,需要先將它緩存到壹個緩沖區。?Java NIO的緩沖導向方法略有不同。數據讀取到壹個它稍後處理的緩沖區,需要時可在緩沖區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所有您需要處理的數據。而且,需確保當更多的數據讀入緩沖區時,不要覆蓋緩沖區裏尚未處理的數據。

補充壹點:NIO的buffer可以使用直接內存緩沖區,該緩沖區不在JVM中,性能會比JVM的緩沖區略好,不過會增加相應的垃圾回收的負擔,因為JVM緩沖區的性能已經足夠好,所以除非在對緩沖有特別要求的地方使用直接緩沖區,盡量使用JVM緩沖。

阻塞與非阻塞

Java IO是阻塞式的操作,當壹個inputstream或outputstream在進行read()或write()操作時,是壹直處於等待狀態的,直到有數據讀/寫入後才進行處理.而NIO是非阻塞式的,當進行讀寫操作時,只會返回當前已經準備好的數據,沒有就返回空,這樣當前線程就可以處理其他的事情,提高了資源的使用率.

與傳統IO的優勢

在老的IO包中,serverSocket和socket都是阻塞式的,因此壹旦有大規模的並發行為,而每壹個訪問都會開啟壹個新線程。這時會有大規模的線程上下文切換操作(因為都在等待,所以資源全都被已有的線程吃掉了),這時無論是等待的線程還是正在處理的線程,響應率都會下降,並且會影響新的線程。

而NIO包中的serverSocket和socket就不是這樣,只要註冊到壹個selector中,當有數據放入通道的時候,selector就會得知哪些channel就緒,這時就可以做響應的處理,這樣服務端只有壹個線程就可以處理大部分情況(當然有些持續性操作,比如上傳下載壹個大文件,用NIO的方式不會比IO好)。

通過兩個圖的比較,可以看出IO是直連的,每個請求都給壹條線程來處理,但是NIO卻是基於反應堆(selector)來處理,直到讀寫的數據準備好後,才會通知相應的線程來進行處理。壹言以蔽之:“selector不會讓channel白占資源,沒事的時候給我去睡覺。”

PS:NIO基於字節進行傳輸,在IO時要註意decode/encode。

更具體的信息請參閱:/zhansong_1987/article/details/45873861

  • 上一篇:初中生學it可以嗎?
  • 下一篇:電腦中運行程序失敗出現運行庫錯誤的問題解決匯總
  • copyright 2024編程學習大全網