天下的「流」都一樣!只要是涉及到流的概念!都會想到舟行碧波上,人在畫中遊的場景。
計算機中按照流的概念主要分為:輸入流和輸出流。
上一文章了解到字節流。現在來了解一下字符流。
除了字節流和字符流之外,還有以下幾個流:轉換流,緩衝流,標準輸入輸出流,數據流等。
字符流一次只處理一個字符,根據流向可分為字符輸入流和字符輸出流。仔細看一下。字節流和字符流處理的數據是有區別的!一個一次處理一個字節,另一個是一次處理一個字符。
IO字符流也有相對應的方法!提供以下方法:
read() 讀取一個字符
read(char[] cbuf) 讀取多個字符到cbuf字符數組
read(char[] cbuf int offset,int len):讀取最多len個字符從offset位置開始存入字符數組cbuf中。
Reader字符輸入流。
Reader是抽象類,抽象類是不能創建對象的。一般都需要通過其子類創建對象,如果我們不創建子類的話是無法使用Reader,因為你要是使用的話就必須實現該類。這裡說到的子類創建對象都是確定性的數據源輸入流。
例如:FileReader文件字符輸入流,源數據就是文件,專門用於讀取文本文件。
代碼實現:
File file = newFile("d:\\javatest\\c.txt");
FileReader reader=new FileReader(file);
char[] cbuf=new char[2];
int len=0;
StringBuilder sb=new StringBuilder();
while((len=reader.read(cbuf))!=-1){
sb.append(cbuf,0,len);
}
System.out.println(sb.toString);
其實字符流和字節流的實現方法都大同小異,只要我們能get到那個點。理解好了,我們就能在計算機中使用。
Writer字符輸出流
其實不管是字節流還是字符流都離不開 」流「 這個概念。就好比江河流水,大海湖泊都離不開水流這一概念。大海湖泊在你看來沒有小溪和河流這種肉眼上就能看到的流通但實際上,大海湖泊還是會流動的,字節流和字符流也是如此!
Writer是字符輸出流的抽象父類,提供以下方法:
write() 寫入一個字符。
write(char[] cbuf) 寫入整個cbuf字符數組到目的地。
write(string):寫入一個字符串到目的地。
Writer是抽象類,不能創建對象。一般都需要通過其子類創建對象,子類都是確定性的目的地字符輸出流,例如FileWriter表示文件字符輸出流,目的地就是文件,專門用於寫入文本性文件。
File file = newFile("d:\\javatest\\d.txt");
1、建立字符輸出流通道。
FileWriter writer=null;
try{
writer = newFileWriter(file);
2、一次寫入一個字符串。
String str = "abc中國";
writer.write(str);
writer.write("你好");
3、flush。
writer.flush();
} catch(IOException e) {
e.printStackTrace();
} finally{
[4] 關閉流。
調用close之前會自動調用flush。
writer.close();
e.printStackTrace();}}
System.out.println("寫入完成");}}
總結:
在Writer的子類中,一般都存在一個字節緩衝區,這個緩衝區用於緩存編碼後的字節,當調用flush時,該字節緩存區都被寫入目的地,我們把這個過程稱為刷新緩衝區。當需要向文件已追加的方式寫入時,構造FileWriter的對象時,在構造方法FileWriter(File file, boolean append) 中append傳入true即可。
注意:默認情況下,FileWriter以平臺默認字符集寫入文件。(win簡體中文:GBK;unix/linux/mac UTF-8)。
字節流:InputSteam字節輸入流,OutputSteam字節輸出流。
字符流:Reader字符輸入流,Writer字符輸出流。
字節流一次只處理一個字節,字符流一次只處理一個字符。
字節對應字節,字符對應字符。