1. 程式人生 > >Java:IO流之:探究快取流

Java:IO流之:探究快取流

前言----

昨天失眠,今天一大早又睡不著,睡了差不多隻有4個小時.這篇部落格寫完,IO流的總結應該也差不多了, 不過寫完差不多也要3點了,趕緊回宿舍補覺

飯後寫了半小時後,困得不行,回宿舍睡到5點,拖到現在才補完了

注:歡迎轉載,轉載請註明來處

 

目錄

一.什麼是快取流 ,為什麼效率高?

二. 從底層程式碼看緩衝流

三.緩衝位元組流

四.緩衝字元流

五.對位元組流有緩衝區的錯誤理解


一.什麼是快取流 ,為什麼效率高?

  • 首先我們以硬碟為介質先看看非快取流的弊端(以位元組流為例):

我們在作業系統 或者計算機組成的課上, 應該知道訪問記憶體的速度>>訪問硬碟的速度 , 我們在讀寫檔案的時候,其實主要的時間花費就是在硬碟的訪問上,  如果是位元組流的話, 我們

 

  • 在瞭解了非快取流的弊端後,  我 可以明確的告訴你, 快取流可以減少訪問硬碟的次數來減少讀取的時間, 效率高

我給大家畫個圖:

 

 

 

二. 從底層程式碼看緩衝流

附一篇部落格(超連結)

注:最特別的是緩衝區的位元組陣列是可變長的

 

 

三.緩衝位元組流

  • 1.通過緩衝位元組流從檔案中讀取字元

demo:

測試內容:"簡1998"(GBK編碼)

	public void testBufferedIntputStream(File f) {
		
		isFile(f);
		byte[] myByte = new byte[10];
		
		try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f))) {
			
			while(bis.read(myByte)!=-1) {
				
			} 
	
			System.out.println(new String(myByte, "GBK"));
			
		}catch(Exception e ) {
			
			e.printStackTrace();
		}

測試結果:

 

  • 2.通過緩衝位元組流向檔案中寫入字元

demo:

測試內容:內容為空(Unicode編碼)

	public void testBufferedOutputStream(File f) {
		
		isFile(f);
		
		
		try(BufferedOutputStream  bos = new BufferedOutputStream(new FileOutputStream(f),10)) {
			
			String str = "簡1998";
			
			bos.write(str.getBytes("Unicode"));
			
			
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

測試結果:

 

 

 

 

四.緩衝字元流

 

  • 1.通過緩衝字元流從檔案中讀取字元

  緩衝流是在某個流的基礎上提供緩衝區的功能,所以需要在建構函式中傳流物件

 

demo:

檔案測試內容:簡1998(Unicode編碼)

	public void testBufferedReader(File f) {
		
		isFile(f);
		
		  try(
				FileInputStream is = new FileInputStream(f);
				InputStreamReader isr= new InputStreamReader(is,Charset.forName("Unicode")); 
				 BufferedReader br = new BufferedReader(isr)
			){
			
			char [] myChar = new char[(int)f.length()];
			
			br.read(myChar);
			System.out.println(myChar);
			
		
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}

測試結果:

 

  • 2.用緩衝字元流向檔案中寫入

demo:

檔案測試內容:內容為空GBK編碼)

	public void testBufferedWriter(File f) {
		
		isFile(f);
		
		String str = "簡1998";
		try(
			 OutputStreamWriter osw= new OutputStreamWriter(new FileOutputStream(f),Charset.forName("Unicode"));
			 BufferedWriter bw  =new BufferedWriter(osw);
			 
				
			){
			
			bw.write(str);			
				
			
			
		}catch(Exception e) {
			
		}
		
	}

測試結果:

 

五.對位元組流有緩衝區的錯誤理解

大家應該知道FileInputStream中read方法有read(byte[]  b),  FileOutputStream中有write(byte[]  b), 有很多人包括我一開始都沒理解好,以為這也是緩衝區, 總以為訪問一次硬碟也能讀取多個位元組, 後面發現了自己一開始就沒理解好, 其實這是代表一次性讀取或者寫入b.length個位元組, 但是不代表訪問一次硬碟就能讀取或者寫入多個位元組,這是緩衝區才有的功能!!  其實跟read(byte) ,write(byte)效率是一樣的

 

  大家可以看到,兩者訪問硬碟的次數都是差不多了