其實並不難就是類比較多。。
io與nio的區別
(1)io面向流,而nio面向緩衝
java IO面向流意味着每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方,
此外,他不能前後移動流中的數據,如果需要前後移動緩存中的數據,需要先將它緩存到一個緩存區。
java NIO的緩衝導向方法略有不同,數據讀取到一個它稍後處理的緩衝區,需要時可在緩衝區中前後移動,
這就增加了處理過程中的靈活性。但是換需要檢查是否該緩衝區中包含您需要處理的數據,而且需確保當更多
的數據讀入緩衝區時,不要覆蓋緩衝區裏尚未處理的數據。
(2)io是阻塞型,nio屬於非阻塞型
java IO各種流阻塞的。這意味着當一個線程調用read()或write()時,該線程被阻塞,直到一些數據被讀
取,或數據完全寫入,該線程在此期間不能再幹任何事情了。
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(); }