緩衝區原理:
臨時存儲數據的方法。減少對設備操作的頻率,提高了效率。其實就是
對數據臨時緩存到了內存(數組)中。
reade()方法原理:
public int myRead() throws IOException{
if(cout==0){
count = r.read(buffer);
index=0;
}
if(count<0){
return -1;}
char ch = buffer[index];
index++;
count--;
return ch;
}
readLine(): 調用了read ();從緩衝區中獲取數據存儲到readLine自己的緩衝區,
它會判斷終止符,只存儲行結束符前的數據。
if(ch=='\r')
continnue;
if(ch=='\n')
return sb.toString();
readLine()方法原理:
public String myReadLine() throws IOException{
StringBuilder sb = new StringBuilder();
int ch =0 ;
while((ch=myRead())!=-1){
if(ch=='\r')
continnue;
if(ch=='\n')
return sb.toString();
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
****裝飾設計模式(wrapper, Decorator): (BufferedReader,BufferedWriter)
可以給對象提供額外的功能,比繼承方式更靈活。
裝飾類與被裝飾類都所屬於同一個體系。
同時裝飾類中持有裝飾類的引用。
BufferedReader bufr= new BufferedReader (new InputStream(System.in));
****** Properties
特點:
1,Hashtable的子類,map集合中的方法都可以使用。
2,該集合沒有泛型,鍵值都是字符串。
3,它是一個可以持久化的屬性集。鍵值可以存儲到集合中,也可以存儲到持久化的設備上
鍵值的來源也可以是持久化的設備。
Properties prop =new Properties();
prop.list(System.out); // 列出給集合的所有對象,主要用於測試
***IO流的規律總結: 解決的問題,就是開發中具體要使用哪個流對象的問題。
1, 明確數據源,數據匯(數據目的)
其實就是在明確要使用的IO體系。InputStream OutoutStram Reader, Writer
需求中操作的是源: 意味着是讀 。 InputStream Reader
需求中操作的是目的: 意味着寫。 OutputStream . Writer
2,操作的數據是否是純文本數據?
是,字符流
否,字節流
是並且是源,Reader
是並且是目的,Writer
通過前兩個明確,明確了具體要使用的體系。
明確體系中要使用哪個對象:
源設備:
硬盤,能操作File 的流對象都是,File開頭
鍵盤,System.in;
內存: 數組
網絡: socker流
目的設備:
硬盤,能操作File 的流對象都是,File開頭
鍵盤,System.out
內存: 數組
網絡: socker流
到第三步明確就可以找到具體的流對象了。
4, 需要額外功能嗎?
需要高效嗎? 緩衝區,Buffered開頭
需要編碼轉換嗎? 轉換流。