NIO和IO 的主要區(qū)別有三個:
1、面向流與面向緩沖:
IO是面向流的竟块。 Java IO面向流意味著每次從流中讀一個或多個字節(jié),直至讀取所有字節(jié)耐齐,它們沒有被緩存在任何地方浪秘。此外,它不能前后移動流中的數(shù)據(jù)埠况。如果需要前后移動從流中讀取的數(shù)據(jù)秫逝,需要先將它緩存到一個緩沖區(qū)。
NIO是面向緩沖區(qū)的询枚,NIO的緩沖導(dǎo)向方法略有不同违帆。數(shù)據(jù)讀取到一個它稍后處理的緩沖區(qū),需要時可在緩沖區(qū)中前后移動金蜀。這就增加了處理過程中的靈活性刷后。但是,還需要檢查是否該緩沖區(qū)中包含所有您需要處理的數(shù)據(jù)渊抄。而且尝胆,需確保當(dāng)更多的數(shù)據(jù)讀入緩沖區(qū)時,不要覆蓋緩沖區(qū)里尚未處理的數(shù)據(jù)护桦。
2含衔,阻塞和非阻塞:
Java IO的各種流是阻塞的。這意味著二庵,當(dāng)一個線程調(diào)用read() 或 write()時贪染,該線程被阻塞,直到有一些數(shù)據(jù)被讀取催享,或數(shù)據(jù)完全寫入杭隙。該線程在此期間不能再干任何事情了。Java NIO的非阻塞模式因妙,使一個線程從某通道發(fā)送請求讀取數(shù)據(jù)痰憎,但是它僅能得到目前可用的數(shù)據(jù)票髓,如果目前沒有數(shù)據(jù)可用時,就什么都不會獲取铣耘,而不是保持線程阻塞洽沟,所以直至數(shù)據(jù)變的可以讀取之前,該線程可以繼續(xù)做其他的事情蜗细。 非阻塞寫也是如此玲躯。一個線程請求寫入一些數(shù)據(jù)到某通道,但不需要等待它完全寫入鳄乏,這個線程同時可以去做別的事情跷车。 線程通常將非阻塞IO的空閑時間用于在其它通道上執(zhí)行IO操作,所以一個單獨的線程現(xiàn)在可以管理多個輸入和輸出通道橱野。
3.IO沒有選擇器朽缴,NIO提供了選擇器(Selectors)
Java NIO的選擇器允許一個單獨的線程來監(jiān)視多個輸入通道,你可以注冊多個通道使用一個選擇器水援,然后使用一個單獨的線程來“選擇”通道:這些通道里已經(jīng)有可以處理的輸入密强,或者選擇已準(zhǔn)備寫入的通道。這種選擇機制蜗元,使得一個單獨的線程很容易來管理多個通道或渤。