IO與NIO

v2-eb408ac849a679b09941be7ebd734768_r.jpg

其實並不難就是類比較多。。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();
		}
相關文章
相關標籤/搜索