IO-3(Reader、Writer、编码、FileReader、FileWriter)
1. Reader
字符輸入流
read(0:讀取單個字符返回
read(char[]):將數據讀到數組中,返回讀取的個數
2. Writer
字符輸入流
已知子類:
- BufferedWriter:高效
- CharArrayWriter:寫入內存緩沖區,不是寫入文件
- PrintWriter:打印流,提供自動刷新,自動換行等功能
寫的位置不同,所以write()未實現,所以Writer為抽象類。起到規范的作用。
3. 編碼
3.1 常見的編碼
GBK
最常用的中文碼表,用2個字節表示(第一個字節開頭為1,第二個字節開頭為0)
unicode
國際標準碼,2個字節存儲。
Java中char類型用此表,char c='a';占用兩個字節
Java中字符串按系統默認表解析,簡體中文版,字符串默認碼表是GBK。
UTF-8
基于unicode,一個字節存儲,更標準化,在每一個字節頭加了編碼信息。
3.2 可識別中文的碼表
GBK,UTF-8
3.3 編碼和解碼
1、編碼:文字----->(數字),"abc".getBytes()----->byte[]
2、解碼:(數字)----->文字,byte[] b={97,98,99}; new String(b);
4. FileReader
java.io.FileReader;
讀取字符流
繼承了InputStreamReader--->Reader
BufferedReader也繼承了Reader.
4.1 構造方法
假定默認字符編碼和默認自己緩沖區大小都適當
FileWriter(String fileName);
FileWriter(String fileName,boolean append):是否追加
4.2 讀數據步驟
運行結果:
4.2.1 分析
FileReader fr=new FileReader("a.txt"):文件a.txt必須存在,否則拋出java.io.FileNotFoundException異常。
int read():一次讀取一個字符。
- int ch=fr.read();
- 若文件a.txt中有換行,read()也會讀到
int read(char[] chs):返回的是實際讀取的個數
- char[] chs=new char[5];
- int len=fr.read(chs); ? ? ? //len=5
- chs; ? ? //chs={'h','e','l','l','o'}
- len=fr.read(chs); ? ? ? //len=5
- chs; ? ? //chs={'\r','\n','w','o','r'}
- len=fr.read(chs); ? ? ? //len=4
- chs; ? ? //chs={'l','d','\r','\n','r'}------上一次讀取的r,此次未覆蓋
說明len讀取長度,不是實際chs的長度————最后顯示數據時,格式為:System.out.println(new String(chs,0,len));只轉實際讀取的長度,排除了前面情況中的'r'。
當實際讀取長度為-1時,說明無數據可讀了,可作為循環判斷條件。
5. FileWriter
java.io.FileWriter;
會拋出IO異常
5.1 構造函數
FileWriter(String FileName);
FileWriter(String FileName,boolean append);是否追加
5.2 寫數據步驟
- 創建輸出流對象
- 調用輸出流對象的寫數據方法
- 釋放資源
運行結果:
5.2.1 分析
- FileWriter fw=new FileWriter("a.txt");----做的事情包括:
- 創建一個a.txt文件,
- 創建一個輸出流對象fw
- 將輸出流對象指向文件
- write(String str):調用fw.write("IO流")時,并未將IO流寫入文件,而是寫入了內存緩沖區,需調用fw.flush()將緩沖區的數據刷新到文件中(硬盤存儲基本單位是字節,此處是字符串,需刷)
- 不釋放資源時,當程序未結束時,不可刪除文件a.txt,因為正在被Java程序使用。
- 當調用fw.close()后,即使Java程序未結束,也可刪除a.txt。
- 若未寫fw.flush()而直接寫了fw.close()則也會將內容刷新到文件中。因為close()會在關閉前檢查緩沖區,若有內容,先fluse()再close(),釋放資源。
- close()之后,流對象fw不可再使用。
5.2.2 write方法
write(String str):寫一個字符串數據
write(String str,int index,int len):一部分
write(int ch):寫一個字符數據,‘a’,97都可以
write(char[] chs):寫一個字符數組
write(char[] cha,int index,int len):一部分
5.2.3 實現數據的換行
fw.write("\n");
但用記事本打開無換行,因為Windows識別的換行是“\r\n”
- Windows:\r\n
- Linux:\n
- mac:\r
5.2.4 數據的追加寫入
用構造函數:FileWriter(String FileName,boolean append);設置append為true,默認是false。
5.3 復制文件
數據源:a.txt
讀數據:FileReader
目的地:b.txt
寫數據:FileWriter
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class Test{public static void main(String[] args) throws IOException {FileReader fr=new FileReader("a.txt");FileWriter fw=new FileWriter("e:\\b.txt");int ch=0;while((ch=fr.read())!=-1)fw.write(ch);fw.flush();fw.close();fr.close();} }運行結果;
? ? ? ? ? ? ??
?
?
總結
以上是生活随笔為你收集整理的IO-3(Reader、Writer、编码、FileReader、FileWriter)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IO-1(Java IO、File类)
- 下一篇: IO-4(BufferedInputSt