其實並不難就是類比較多。。java
io與nio的區別緩存
(1)io面向流,而nio面向緩衝ide
java IO面向流意味着每次從流中讀一個或多個字節,直至讀取全部字節,它們沒有被緩存在任何地方,spa
此外,他不能先後移動流中的數據,若是須要先後移動緩存中的數據,須要先將它緩存到一個緩存區。線程
java NIO的緩衝導向方法略有不一樣,數據讀取到一個它稍後處理的緩衝區,須要時可在緩衝區中先後移動,blog
這就增長了處理過程當中的靈活性。可是換須要檢查是否該緩衝區中包含您須要處理的數據,並且需確保當更多ip
的數據讀入緩衝區時,不要覆蓋緩衝區裏還沒有處理的數據。get
(2)io是阻塞型,nio屬於非阻塞型it
java IO各類流阻塞的。這意味着當一個線程調用read()或write()時,該線程被阻塞,直到一些數據被讀io
取,或數據徹底寫入,該線程在此期間不能再幹任何事情了。
java NIO 的非阻塞模式,使一個線程從某通道發送請求讀取數據,可是它僅能獲得目前可用的數據,若是
目前沒有可用的數據時,就什麼都不獲取,而不是保持線程阻塞,因此直至數據變的能夠讀取以前,該線程可
以繼續作其餘事情。非阻塞寫也是如此,一個線程請求寫入一些數據到某通道,但不須要等待它徹底寫入,這
個線程同時能夠去幹其它事情。線程一般將非阻塞IO的空閒時間用於其它通道上執行IO操做,全部一個單獨的
線程如今能夠管理多個輸入和輸出通道(channel)。
(3)NIO具備選擇器,IO沒有
java NIO的選擇器容許一個單獨線程來監視多個輸入通道,你能夠註冊多個通道使用一個選擇器,而後使
用一個單獨的線程來「選擇」通道:這些通道里已經有能夠處理的輸入,或者選擇已準備寫入的通道。這種選擇
機制,使得一個單獨線程很容易來管理多個通道
NIO如何使用
(1)爲何要使用NIO
nio比io快,nio使用塊操做(操做數據時一個數據塊一個數據塊的操做,而IO是一個字節一個字節的
操做),而不是流。
(2)NIO的使用:
public static void main(String[] args) throws IOException { File from = new File("b.txt"); File to = new File("f.txt"); readFile(from,to); } public static void readFile(File from,File to) throws IOException{ //獲取源文件和目標文件的輸入輸出流 FileInputStream fis = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to); //獲取輸入輸出通道 FileChannel fclFrom = fis.getChannel(); FileChannel fclTo = fos.getChannel(); //建立緩衝區 ByteBuffer bb = ByteBuffer.allocate(1024); while(true){ bb.clear(); //重設緩衝區,使他能夠接受讀入的數據 int r = fclFrom.read(bb); //從輸入通道將數據讀到緩衝區 if(r == -1) break; bb.flip(); //讓緩衝區能夠將新讀入的數據寫入另外一個通道 fclTo.write(bb); } fis.close(); fos.close(); }