IO與NIO

v2-eb408ac849a679b09941be7ebd734768_r.jpg

其實並不難就是類比較多。。


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();
		}




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