javaSE 筆記 字元流 + 字元緩衝流 + IO流小結
為什麼會輸出字元流
由於位元組流操作中文不是特別的方便,所以java就提供字元流
字元流 = 位元組流 + 編碼表
用位元組流複製文字檔案時,文字檔案也會有中文,但是沒問題,因為最終底層操作會自動進行位元組拼接成中文,如何識別是中文的呢?
漢字在儲存的時候,無論選擇哪種編碼儲存,第一個位元組都是負數。
編碼表
計算機要準確的儲存和識別各種字符集符號,就需要進行字元編碼,一套字符集必然至少有一套字元編碼。常見的字符集有ASCII字符集,GCXXX字符集
,Unicode字符集
GBK是比較重要的支援中文編碼的字符集,Unicode被稱為萬國碼,有三種編碼方案,分別是UTF-8,UTF-16,UTF-32,最常用的是UTF-8,
它使用一至四個位元組為每個字元編碼。
字串中的編碼解碼問題
String s = "中國";
bytes[] bys = s.getBytes("UTF-8"); // [-28,-72,-83,-27,-101,-67]
String ss = new String(bys,"UTF-8");
System.out.println(ss);
bytes[] bys = s.getBytes("GBK"); // [-42,-48,-71,-6]
String ss = new String(bys,"GBK");
System.out.println(ss);
使用何種字符集進行編碼,就必須使用何種字符集進行解碼
字元流中的編碼解碼問題
字元流抽象基類:Reader:字元輸入流的抽象類 Writer:字元輸出流的抽象類
字元流中編碼解碼問題相關的兩個類:InputStreamReader,OutputStreamWriter
InputStreamReader(InputStream isr)是從位元組流到字元流的橋樑,它讀取位元組,並使用指定的字符集將其解碼為字元
InputStreamReader isr = new InputStreamReader(new FileInputStream("D://qqq.txt","UTF-8"))
OutputStreamWriter(OutputStream osw)是從字元流到位元組流的橋樑,它使用指定的字符集將寫入的字元編碼為位元組
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D://qqq.txt"),"UTF-8")
跟上面的字串編解碼問題比較,一個是在由字元陣列轉成字串的時候,必須指明特定的字符集進行解碼,而這邊是在位元組流物件轉成字元流物件的時候,指明特定的字符集進行解碼。
字元流寫資料的5種方式
1.寫一個字元,一個字元陣列,一個字元陣列的一部分,一個字串,一個字串的一部分
注意字元流寫資料是沒法直接寫進去的,因為真正寫進去還是得靠位元組流,這時還在緩衝區,需要呼叫一次osw.flush() //重新整理流,
然後注意釋放資源osw.close()這個方法是先重新整理後關閉的
字元流讀資料的2種方式
1.//int read()一次讀取一個位元組
int ch;
while ((ch=isr.read())!=-1){
System.out.print((char)ch)
}
2.//int read(char[] cbuf),一次讀取一個字元陣列資料
char[] chs = new char[1024];
int len;
while((len=isr.read())!=-1){
System.out.print(new String(chs,0,len)); //這邊呼叫的是String的引數為字元陣列的構造方法,前面還有引數為位元組陣列的構造方法
}
複製java檔案改進版
因為InputStreamReader和OutputStreamWriter寫起來實在太麻煩了,所以我們直接使用它的子類,FileReader和FileWriter,分別
是讀取字元檔案的便捷類以及寫入字元檔案的便捷類。但是想做字元流中的編碼問題,還得使用轉換流,InputStreamReader和OutputStreamWriter。
整個讀寫過程是這樣的:一個檔案要讀,然後想到Reader基類,再想到字元輸入流物件InputStreamReader,但是寫起來太麻煩,就想使用
簡單的讀取字元檔案的子類,FileReader。寫資料的話整個心路歷程也是這樣的。
然後注意FileReader和FileWriter既然是轉換流的子類,那麼他們同樣是跟轉換流一樣有多種讀取和寫入的方法的。
字元緩衝流
BufferedWriter:將文字寫入字元輸出流,緩衝字元,以提供單個字元,陣列和字串的高效寫入,可以指定緩衝區大小,或者可以接受預設大小
,預設值足夠大, 可用於大多數用途。
BufferedReader:從字元輸入流讀取文字,緩衝字元,其他差不多
具體操作跟位元組緩衝流也沒什麼不同的。
字元緩衝流特有功能
BufferedWriter:
void newLine():寫一行 行分隔符,行分隔符由系統屬性定義
BufferedReader:
public String readLine():讀一行文字。結果包含行的內容的字串,不包括任何行終止字元。如果流的結尾已經到達,則為Null。
IO流小結:
位元組流:
因為InputStream和OutputStream是抽象類,所以我們選擇使用他們的子類。
字元流: