21.01_IO流(字符流FileReader)
- 1.字符流是什么
- 字符流是可以直接讀寫字符的IO流
- 字符流讀取字符, 就要先讀取到字節(jié)數(shù)據(jù), 然后轉為字符. 如果要寫出字符, 需要把字符轉為字節(jié)再寫出.
- 2.FileReader, FileWriter
- FileReader類的read()方法可以按照字符大小讀取
-
FileReader fr = new FileReader("aaa.txt"); //創(chuàng)建輸入流對象,關聯(lián)aaa.txt int ch; while((ch = fr.read()) != -1) { //將讀到的字符賦值給ch System.out.println((char)ch); //將讀到的字符強轉后打印 } fr.close(); //關流
- FileWriter類的write()方法可以自動把字符轉為字節(jié)寫出
21.02_IO流(字符流FileWriter)
-
FileWriter類的write()方法可以自動把字符轉為字節(jié)寫出
FileWriter fw = new FileWriter("aaa.txt"); fw.write("aaa"); fw.close();
21.03_IO流(字符流的拷貝)
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
int ch;
while((ch = fr.read()) != -1) {
fw.write(ch);
}
fr.close();
fw.close();
21.04_IO流(什么情況下使用字符流)
- 字符流也可以拷貝文本文件, 但不推薦使用. 因為讀取時會把字節(jié)轉為字符, 寫出時還要把字符轉回字節(jié).
- 程序需要讀取一段文本, 或者需要寫出一段文本的時候可以使用字符流
21.05_IO流(字符流是否可以拷貝非純文本的文件)
- 不可以拷貝非純文本的文件
- 因為在讀的時候會將字節(jié)轉換為字符,在轉換過程中,可能找不到對應的字符,就會用?代替,寫出的時候會將字符轉換成字節(jié)寫出去
- 如果是?,直接寫出,這樣寫出之后的文件就亂了,看不了了
21.06_IO流(自定義字符數(shù)組的拷貝)
FileReader fr = new FileReader("aaa.txt"); //創(chuàng)建字符輸入流,關聯(lián)aaa.txt FileWriter fw = new FileWriter("bbb.txt"); //創(chuàng)建字符輸出流,關聯(lián)bbb.txt int len; char[] arr = new char[1024*8]; //創(chuàng)建字符數(shù)組 while((len = fr.read(arr)) != -1) { //將數(shù)據(jù)讀到字符數(shù)組中 fw.write(arr, 0, len); //從字符數(shù)組將數(shù)據(jù)寫到文件上 } fr.close(); //關流釋放資源 fw.close();
21.07_IO流(帶緩沖的字符流)
- BufferedReader的read()方法讀取字符時會一次讀取若干字符到緩沖區(qū), 然后逐個返回給程序, 降低讀取文件的次數(shù), 提高效率
- BufferedWriter的write()方法寫出字符時會先寫到緩沖區(qū), 緩沖區(qū)寫滿時才會寫到文件, 降低寫文件的次數(shù), 提高效率
BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); //創(chuàng)建字符輸入流對象,關聯(lián)aaa.txt BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt")); //創(chuàng)建字符輸出流對象,關聯(lián)bbb.txt int ch; while((ch = br.read()) != -1) { //read一次,會先將緩沖區(qū)讀滿,從緩沖去中一個一個的返給臨時變量ch bw.write(ch); //write一次,是將數(shù)據(jù)裝到字符數(shù)組,裝滿后再一起寫出去 } br.close(); //關流 bw.close();
21.08_IO流(readLine()和newLine()方法)
- BufferedReader的readLine()方法可以讀取一行字符(不包含換行符號)
- BufferedWriter的newLine()可以輸出一個跨平臺的換行符號"\r\n"
BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt")); String line; while((line = br.readLine()) != null) { bw.write(line); //bw.write("\r\n"); //只支持windows系統(tǒng) bw.newLine(); //跨平臺的 } br.close(); bw.close();
21.09_IO流(將文本反轉)
- 將一個文本文檔上的文本反轉,第一行和倒數(shù)第一行交換,第二行和倒數(shù)第二行交換
21.10_IO流(LineNumberReader)
- LineNumberReader是BufferedReader的子類, 具有相同的功能, 并且可以統(tǒng)計行號
- 調用getLineNumber()方法可以獲取當前行號
- 調用setLineNumber()方法可以設置當前行號
LineNumberReader lnr = new LineNumberReader(new FileReader("aaa.txt")); String line; lnr.setLineNumber(100); //設置行號 while((line = lnr.readLine()) != null) { System.out.println(lnr.getLineNumber() + ":" + line);//獲取行號 } lnr.close();
21.11_IO流(裝飾設計模式)
interface Coder { public void code(); } class Student implements Coder { @Override public void code() { System.out.println("javase"); System.out.println("javaweb"); } } class ItcastStudent implements Coder { private Student s; //獲取到被包裝的類的引用 public ItcastStudent(Student s) { //通過構造函數(shù)創(chuàng)建對象的時候,傳入被包裝的對象 this.s = s; } @Override public void code() { //對其原有功能進行升級 s.code(); System.out.println("數(shù)據(jù)庫"); System.out.println("ssh"); System.out.println("安卓"); System.out.println("....."); } }
21.12_IO流(使用指定的碼表讀寫字符)
- FileReader是使用默認碼表讀取文件, 如果需要使用指定碼表讀取, 那么可以使用InputStreamReader(字節(jié)流,編碼表)
- FileWriter是使用默認碼表寫出文件, 如果需要使用指定碼表寫出, 那么可以使用OutputStreamWriter(字節(jié)流,編碼表)
BufferedReader br = //高效的用指定的編碼表讀 new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"), "UTF-8")); BufferedWriter bw = //高效的用指定的編碼表寫 new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"), "GBK")); int ch; while((ch = br.read()) != -1) { bw.write(ch); } br.close(); bw.close();
21.13_IO流(轉換流圖解)
- 畫圖分析轉換流
21.14_IO流(獲取文本上字符出現(xiàn)的次數(shù))
- 獲取一個文本上每個字符出現(xiàn)的次數(shù),將結果寫在times.txt上
21.15_IO流(試用版軟件)
- 當我們下載一個試用版軟件,沒有購買正版的時候,每執(zhí)行一次就會提醒我們還有多少次使用機會用學過的IO流知識,模擬試用版軟件,試用10次機會,執(zhí)行一次就提示一次您還有幾次機會,如果次數(shù)到了提示請購買正版
21.16_IO流(總結)
- 1.會用BufferedReader讀取GBK碼表和UTF-8碼表的字符
- 2.會用BufferedWriter寫出字符到GBK碼表和UTF-8碼表的文件中
- 3.會使用BufferedReader從鍵盤讀取一行