所有的檔案和源代碼都開源在GitHub: https://github.com/kun213/JavaNotes上了,希望我們可以一起加油,一起學習,一起交流
day12【IO流】
@
目錄- day12【IO流】
- 一、常用的編碼表
- 1.1 可以說出常用的編碼表
- 二、轉換流
- 2.1 如何使用OutputStreamWriter寫資料到檔案
- 2.1.1 構造方法
- 2.1.2 寫出資料方法
- 2.2 如何使用InputStreamReader讀取資料
- 2.2.1 構造方法
- 2.2.2 讀取資料方法
- 2.1 如何使用OutputStreamWriter寫資料到檔案
- 三、字符流便捷類
- 3.1 FileWriter類
- 3.1.1 如何使用FileWirter寫資料到檔案
- 3.1.2可以說出FileWriter中關閉和重繪方法的區別
- 3.1.3 如何使用FileWriter寫資料實作換行和追加寫
- 3.2 FileReader類
- 3.2.1 如何使用FileReader讀資料
- 3.1 FileWriter類
- 四、字符緩沖流
- 4.1 如何使用BufferedWriter寫換行
- 4.2 如何使用BufferedReader讀取文本行
- 五、列印流
一、常用的編碼表
1.1 可以說出常用的編碼表
- ASCII字符集 :
- ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,用于顯示現代英語,主要包括控制字符(回車鍵、退格、換行鍵等)和可顯示字符(英文大小寫字符、阿拉伯數字和西文符號),
- 基本的ASCII字符集,使用7位(bits)表示一個字符,共128字符,ASCII的擴展字符集使用8位(bits)表示一個字符,共256字符,方便支持歐洲常用字符,
- ISO-8859-1字符集:
- 拉丁碼表,別名Latin-1,用于顯示歐洲使用的語言,包括荷蘭、丹麥、德語、意大利語、西班牙語等,
- ISO-8859-1使用單位元組編碼,兼容ASCII編碼,
- GBxxx字符集:
- GB就是國標的意思,是為了顯示中文而設計的一套字符集,
- GB2312:簡體中文碼表,一個小于127的字符的意義與原來相同,但兩個大于127的字符連在一起時,就表示一個漢字,這樣大約可以組合了包含7000多個簡體漢字,此外數學符號、羅馬希臘的字母、日文的假名們都編進去了,連在ASCII里本來就有的數字、標點、字母都統統重新編了兩個位元組長的編碼,這就是常說的"全角"字符,而原來在127號以下的那些就叫"半角"字符了,
- GBK:最常用的中文碼表,是在GB2312標準基礎上的擴展規范,使用了雙位元組編碼方案,共收錄了21003個漢字,完全兼容GB2312標準,同時支持繁體漢字以及日韓漢字等,
- 中文版作業系統使用的編碼表就是GBK,
- 中文漢字在2312和GBK編碼表中均為兩個位元組表示,第一個位元組為負數,第二個位元組可能是負數也可能是正數,
- GB18030:最新的中文碼表,收錄漢字70244個,采用多位元組編碼,每個字可以由1個、2個或4個位元組組成,支持中國國內少數民族的文字,同時支持繁體漢字以及日韓漢字等,尚未正式啟用,
- Unicode字符集 :
- Unicode編碼系統為表達任意語言的任意字符而設計,是業界的一種標準,也稱為統一碼、標準萬國碼,
- 它最多使用4個位元組的數字來表達每個字母、符號,或者文字,有三種編碼實作方案,UTF-8、UTF-16和UTF-32,最為常用的UTF-8編碼,
- UTF-8編碼,可以用來表示Unicode標準中任何字符,它是電子郵件、網頁及其他存盤或傳送文字的應用中,優先采用的編碼,互聯網工程作業小組(IETF)要求所有互聯網協議都必須支持UTF-8編碼,所以,我們開發Web應用,也要使用UTF-8編碼,它使用一至四個位元組為每個字符編碼,編碼規則:
- 128個US-ASCII字符,只需一個位元組編碼,
- 拉丁文等字符,需要二個位元組編碼,
- 大部分常用字(含中文),使用三個位元組編碼,
- 其他極少使用的Unicode輔助字符,使用四位元組編碼,
- UTF-8是變長編碼表,漢字在UTF-8中均為負數,
二、轉換流
2.1 如何使用OutputStreamWriter寫資料到檔案
2.1.1 構造方法
OutputStreamWriter(OutputStream in): 創建一個使用默認字符集的字符流,OutputStreamWriter(OutputStream in, String charsetName): 創建一個指定字符集的字符流,
OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt"));
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");
2.1.2 寫出資料方法
void write(int c)寫出單個字符,void write(char[] ch)寫出字符陣列,void write(char[] ch,int off,int len)寫出字符陣列一部分,開始索引和寫出的個數,void write(String s)寫入字串,void flush()重繪該流的緩沖,字符流寫資料會先寫在記憶體中,重繪后才會到達目的檔案,
public static void main(String[] args) throws IOException {
// 定義檔案路徑
String FileName = "E:\\out.txt";
// 創建流物件,默認UTF8編碼
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(FileName));
// 寫出資料
osw.write("你好"); // 保存為6個位元組
osw.flush();
osw.close();
// 定義檔案路徑
String FileName2 = "E:\\out2.txt";
// 創建流物件,指定GBK編碼
OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream(FileName2),"GBK");
// 寫出資料
osw2.write("你好");// 保存為4個位元組
osw2.flush();
osw2.close();
}
2.2 如何使用InputStreamReader讀取資料
2.2.1 構造方法
InputStreamReader(InputStream in): 創建一個使用默認字符集的字符流,InputStreamReader(InputStream in, String charsetName): 創建一個指定字符集的字符流,
InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");
2.2.2 讀取資料方法
int read()讀取單個字符,讀取到檔案末尾時回傳-1,int read(char[] ch)讀取字符存盤到陣列中個,回傳讀取到的字符個數,讀取到檔案末尾時回傳-1,
public static void main(String[] args) throws IOException {
// 定義檔案路徑,檔案為gbk編碼
String FileName = "E:\\file_gbk.txt";
// 創建流物件,默認UTF8編碼
InputStreamReader isr = new InputStreamReader(new FileInputStream(FileName));
// 創建流物件,指定GBK編碼
InputStreamReader isr2 = new InputStreamReader(new FileInputStream(FileName) , "GBK");
// 定義變數,保存字符
int read;
// 使用默認編碼字符流讀取,亂碼
while ((read = isr.read()) != -1) {
System.out.print((char)read);
}
isr.close();
// 使用指定編碼字符流讀取,正常決議
while ((read = isr2.read()) != -1) {
System.out.print((char)read);// 大家好
}
isr2.close();
}
三、字符流便捷類
3.1 FileWriter類
3.1.1 如何使用FileWirter寫資料到檔案
構造方法
FileWriter(File file): 創建一個新的 FileWriter,給定要讀取的File物件,FileWriter(String fileName): 創建一個新的 FileWriter,給定要讀取的檔案的名稱,
寫出資料
public static void main(String[] args) throws IOException {
// 使用檔案名稱創建流物件
FileWriter fw = new FileWriter("fw.txt");
//寫出單個字符
fw.write(97),
fw.flush();
//寫出字符陣列
char[] chs = "CodeBull".toCharArray();
fw.write(chs);
fw.flush();
//寫出字符陣列的一部分,開始索引,寫出個數
fw.write(chs,1,3);
fw.flush();
//寫出字串
fw.write("CodeBull");
fw.flush();
fw.close();
}
注意:字串輸出資料,必須要使用flush()方法,否則資料在記憶體中,不會到達指定檔案,close()方法在關閉前也會進行重繪,推薦寫一次重繪一次,避免記憶體占用過多,
3.1.2可以說出FileWriter中關閉和重繪方法的區別
因為內置緩沖區的原因,如果不關閉輸出流,無法寫出字符到檔案中,但是關閉的流物件,是無法繼續寫出資料的,如果我們既想寫出資料,又想繼續使用流,就需要flush 方法了,
close()和flush()方法的區別
flush():重繪緩沖區,流物件還可以繼續使用,
? close():先重繪緩沖區,然后通知系統釋放資源,流物件不可以再被使用了,
3.1.3 如何使用FileWriter寫資料實作換行和追加寫
構造方法
FileWriter(File file, boolean append): 根據給定的 File 物件構造一個 FileWriter 物件,FileWriter(String fileName, boolean append): 根據給定的檔案名以及指示是否附加寫入資料的 boolean 值來構造 FileWriter 物件,
寫資料實作追加寫
/**
* 位元組流寫入資料: 追加和換行
* 流物件構造方法,第二個引數true
* 換行問題:
* Windows: \r\n
* Linux: \n
* Mac: \r
*/
public static void main(String[] args)
throws IOException {
FileWriter fw = new FileWriter("day12-code/1.txt",true);
fw.write("第一行\n");
fw.write("第二行");
fw.write("第三行");
fw.close();
}
}
3.2 FileReader類
3.2.1 如何使用FileReader讀資料
構造方法
FileWriter(File file): 創建一個新的 FileWriter,給定要讀取的File物件,FileWriter(String fileName): 創建一個新的 FileWriter,給定要讀取的檔案的名稱,
讀取資料
public static void main(String[] args) throws IOException {
// 使用檔案名稱創建流物件
FileReader fr = new FileReader("read.txt");
// 定義變數,保存有效字符個數
int len ;
// 定義字符陣列,作為裝字符資料的容器
char[] cbuf = new char[2];
// 回圈讀取
while ((len = fr.read(cbuf))!=-1) {
System.out.println(new String(cbuf,0,len));
}
// 關閉資源
fr.close();
}
四、字符緩沖流
4.1 如何使用BufferedWriter寫換行
構造方法
BufferedWriter(Writer out): 創建一個新的緩沖輸出流,
// 創建字符緩沖輸出流
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
特有方法
- BufferedWriter:
public void newLine(): 寫一行行分隔符,由系統屬性定義符號,
public static void main(String[] args) throws IOException {
// 創建流物件
BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));
// 寫出資料
bw.write("CodeBull");
// 寫出換行
bw.newLine();
bw.write("加油");
bw.newLine();
bw.write("努力");
bw.newLine();
// 釋放資源
bw.close();
}
4.2 如何使用BufferedReader讀取文本行
構造方法
BufferedReader(Reader in):創建一個 新的緩沖輸入流,
// 創建字符緩沖輸入流
BufferedReader br = new BufferedReader(new FileReader("br.txt"));
特有方法
- BufferedReader:
public String readLine(): 讀一行文字,
public static void main(String[] args) throws IOException {
// 創建流物件
BufferedReader br = new BufferedReader(new FileReader("in.txt"));
// 定義字串,保存讀取的一行文字
String line = null;
// 回圈讀取,讀取到最后回傳null
while ((line = br.readLine())!=null) {
System.out.print(line);
System.out.println("------");
}
// 釋放資源
br.close();
}
五、列印流
列印流的特點
- 列印流指負責輸出資料,不負責資料來源,
- 列印流永遠不會拋出IOException,
- 使用PrintWriter列印流,可以開啟自動重繪功能,
- 呼叫println,printf,format三個方法中的一個才能自動重繪,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/172569.html
標籤:其他
上一篇:Seaborn的6個簡單技巧
