Java NIO 與 IO的區別

下表總結了Java NIO和IO之間的差別:

IO NIO
面向流 面向緩衝
阻塞IO 非阻塞IO
無                    選擇器(Selector)

下面將詳細分析它們之間的區別:

1、面向流和麪向緩衝

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


2、阻塞與非阻塞IO

Java IO的各種流是阻塞的,這就意味着,當一個線程調用read()或write()方法時,該線程會被阻塞,直到有一些數據被讀取或數據完全寫入。該線程在此期間不能再幹任何其他事情了。Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什麼都不會獲取,而不是保持線程阻塞,所以直至數據變得可讀取之前,該線程可繼續做其他事情。非阻塞寫也是如此,一個線程請求寫入一些數據到某通道,但不需要等他完全寫入,這個線程同時可以去做別的事情。線程通常將非阻塞IO的空閒時間用於在其他通道上執行IO操作,所以一個單獨的線程可以管理多個輸入和輸出通道(Channel)。

3、選擇器(Selector)

Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以使用一個選擇器註冊多個通道,然後使用一個單獨的線程來選擇通道:這些通道里已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程可以很容易的來管理多個通道。

原文:http://ifeve.com/java-nio-vs-io/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章