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