JAVA NIO 和IO
之前有被問到NIO與IO的區別,但是遺憾的是我沒有好好看過NIO。
NIO是什麼
NIO是java1.4之後新出的一套IO介面。NIO相比IO,最大的特點就是非阻塞。
區別:
區別 | IO | NIO |
---|---|---|
1 | 面向流 | 面向通道和緩衝區 |
2 | 阻塞 | 非阻塞 |
3 | 無 | 有選擇器 |
具體表現為:
面向流與面向緩衝
Java NIO和IO之間第一個最大的區別是,IO是面向流的,NIO是面向緩衝區的。 Java IO面向流意味著每次從流中讀一個或多個位元組,直至讀取所有位元組,它們沒有被快取在任何地方。此外,它不能前後移動流中的資料
阻塞與非阻塞IO (NIO中一個執行緒在等待的時候,可以做其他事情)
Java IO的各種流是阻塞的。這意味著,當一個執行緒呼叫read() 或 write()時,該執行緒被阻塞,直到有一些資料被讀取,或資料完全寫入。該執行緒在此期間不能再幹任何事情了。 Java NIO的非阻塞模式,使一個執行緒從某通道傳送請求讀取資料,但是它僅能得到目前可用的資料,如果目前沒有資料可用時,就什麼都不會獲取。而不是保持執行緒阻塞,所以直至資料變的可以讀取之前,該執行緒可以繼續做其他的事情。 非阻塞寫也是如此。一個執行緒請求寫入一些資料到某通道,但不需要等待它完全寫入,這個執行緒同時可以去做別的事情。 執行緒通常將非阻塞IO的空閒時間用於在其它通道上執行IO操作,所以一個單獨的執行緒現在可以管理多個輸入和輸出通道(channel)。
選擇器(Selectors)
Java NIO的選擇器允許一個單獨的執行緒來監視多個輸入通道,你可以註冊多個通道使用一個選擇器,然後使用一個單獨的執行緒來“選擇”通道:這些通道里已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的執行緒很容易來管理多個通道。
使用Selectors的好處是:使用更少的執行緒來管理多個通道(多路複用器),相比IO的一個連線通過一個執行緒處理,避免了上下文切換帶來的開銷。