請問在java的實際開發中,應該什麼時候用傳統IO,什麼時候用NIO?

時間 2021-05-06 23:39:45

1樓:一一哥

一,NIO新特性

NIO的一些新特性有:非阻塞I/O,選擇器,緩衝以及管道。管道(Channel),緩衝(Buffer) ,選擇器( Selector)是其主要特徵。

二,Channel、Selector解釋

Channel——管道實際上就像傳統IO中的流,到任何目的地(或來自任何地方)的所有資料都必須通過乙個 Channel 物件。乙個 Buffer 實質上是乙個容器物件。

Selector——選擇器用於監聽多個管道的事件,使用傳統的阻塞IO時我們可以方便的知道什麼時候可以進行讀寫,而使用非阻塞通道,我們需要一些方法來知道什麼時候通道準備好了,選擇器正是為這個需要而誕生的。

三,IO是面向流的,NIO是面向塊(緩衝區)

IO面向流的操作一次乙個位元組地處理資料。乙個輸入流產生乙個位元組的資料,乙個輸出流消費乙個位元組的資料。,導致了資料的讀取和寫入效率不佳;

NIO面向塊的操作在一步中產生或者消費乙個資料塊。按塊處理資料比按(流式的)位元組處理資料要快得多,同時資料讀取到乙個它稍後處理的緩衝區,需要時可在緩衝區中前後移動。這就增加了處理過程中的靈活性。

通俗來說,NIO採取了「預讀」的方式,當你讀取某一部分資料時,他就會猜測你下一步可能會讀取的資料而預先緩衝下來。

四,IO是阻塞的,NIO是非阻塞的

對於傳統的IO,當乙個執行緒呼叫read() 或 write()時,該執行緒被阻塞,直到有一些資料被讀取,或資料完全寫入。該執行緒在此期間不能再幹任何事情了。

而對於NIO,使用乙個執行緒傳送讀取資料請求,沒有得到響應之前,執行緒是空閒的,此時執行緒可以去執行別的任務,而不是像IO中那樣只能等待響應完成。

五,NIO和IO適用場景

如果需要管理同時開啟的成千上萬個連線,這些連線每次只是傳送少量的資料,例如聊天伺服器,這時候用NIO處理資料可能是個很好的選擇。比如:Netty是乙個NIO客戶端、服務端框架。

允許快速簡單的開發網路應用程式。

而如果只有少量的連線,而這些連線每次要傳送大量的資料,這時候傳統的IO更合適。使用哪種處理資料,需要在資料的響應等待時間和檢查緩衝區資料的時間上作比較來權衡選擇。

2樓:鍵盤俠

NIO比傳統IO強的關鍵地方在於,可以設定使用作業系統底層的非阻塞api,在這個條件下,你可以實現單個執行緒同時監聽(處理)多個socket連線,這樣做可以節省執行緒資源

但是節省執行緒資源並不是必要的,如果現在只需要1個socket連線,或者socket連線持續有讀寫請求,這時候單個執行緒繫結乙個socket連線就很好了,NIO的開發成本更高,沒有必要。

PS:很多回答說實話根本沒答到點子上,這水平去面試肯定掛了。。還有些說平時用不到NIO的,現在只要涉及網路IO,linux伺服器上NIO幾乎是必選,比如Dubbo、RocketMQ、Hadoop,還有開源集群運算框架 Spark、分布式計算框架 Storm、構建 JVM 上的併發應用和分布式應用 Akka,都支援NIO作為通訊基礎

3樓:本設一木

優勢在於乙個執行緒管理多個通道;但是資料的處理將會變得複雜;

如果需要管理同時開啟的成千上萬個連線,這些連線每次只是傳送少量的資料,採用這種;

適用於乙個執行緒管理乙個通道的情況;因為其中的流資料的讀取是阻塞的;

如果需要管理同時開啟不太多的連線,這些連線會傳送大量的資料;

4樓:Mooneal

大部分實際開發中,你不需要nio,即使用,也有造好的,比如netty這樣的輪子了。你只要在用的時候,清楚它的原理,在技術選型的時候,做到心裡有數就好了~

5樓:februy

IO選擇的核心數是連線數的問題。

因為傳統IO中每乙個連線都需要乙個執行緒去管理,都會占用記憶體等系統資源,在連線數較少的情況下,每個連線有專門的執行緒來管理,是非常高效的。

而一旦連線數很多,那我們的系統資源是有上限的,此時比較適合使用NIO。因為NIO底層通過乙個/少量執行緒來管理成千上萬個連線,通過epoll和事件狀態機制來管理。實際上我們目前的開發中很多框架中已經使用了NIO,比如在rpc的設計中,針對海量連線的情況,就會有NIO的使用,當然目前一般是採用netty來開發。

6樓:碼神手記

一切為了併發,為了提高有限數量執行緒的利用率。

搞清楚幾個問題:阻塞IO是什麼?非阻塞IO是什麼?非阻塞IO是為了解決什麼問題而出現的?答案自然就有了。

7樓:廖雪峰

在滿足需求的前提下,絕大部分時候用傳統IO足夠了。

如果老闆實在摳門,只有幾台機器,還要榨乾機器的每一分效能,說明公司太窮,建議跳槽。

真需要用NIO的時候,建議在Netty的基礎上開發,別給自己加活,因為加班不加錢。

我想問下實際Java專案開發中,需要匯入的jar包多不多

threedr3am 多,一般像我們實際企業開發,乙個稍微有點規模的系統,基本都會用上mysql redis mq等,然後在對接這些元件必然大概率用到相應的封裝jar包去接入,例如要用mysql,有可能就會用到mybatis或者hibernate亦或者jpa jdbc等等。然後除了這些比較常見的元件...

Java中的Get和Set方法有什麼實際意義?

不知名 因為一般情況下,對成員變數的使用沒有任何限制。不過有時候我們希望發布的物件能夠按照自己的規則進行發布 public class Demo private String strings new String A B C public String getStringsreturn Arrays...

vw相比rem,在實際開發中究竟有多大區別?

乙隻會飛的豬 我覺得吧,rem 和 vw 唯一不同的就是說rem,它多了一層可以人為控制的鉤子,在一些特殊的場景下配合 mediaQuery 發揮他的作用,而用vw vh 只是硬生生的依賴了視口百分比,我覺得可以把rem作為中間單位,最終的fontSize 還是cacl vw來,這樣既可以保持靈活度...