Java:IO流之:探究快取流
阿新 • • 發佈:2018-11-21
前言----
昨天失眠,今天一大早又睡不著,睡了差不多隻有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)效率是一樣的
大家可以看到,兩者訪問硬碟的次數都是差不多了