Java基礎知識-IO流2
阿新 • • 發佈:2019-01-04
21.01_IO流(字元流FileReader)
- 1.字元流是什麼
- 字元流是可以直接讀寫字元的IO流
- 字元流讀取字元, 就要先讀取到位元組資料, 然後轉為字元. 如果要寫出字元, 需要把字元轉為位元組再寫出.
- 2.FileReader
- FileReader類的read()方法可以按照字元大小讀取
FileReader fr = new FileReader("aaa.txt"); //建立輸入流物件,關聯aaa.txt int ch; while((ch = fr.read()) != -1) { //將讀到的字元賦值給ch System.out.println((char)ch); //將讀到的字元強轉後列印 } fr.close(); //關流
21.02_IO流(字元流FileWriter)
FileWriter類的write()方法可以自動把字元轉為位元組寫出
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流(什麼情況下使用字元流)
- 字元流也可以拷貝文字檔案, 但不推薦使用. 因為讀取時會把位元組轉為字元, 寫出時還要把字元轉回位元組.
- 程式需要讀取一段文字, 或者需要寫出一段文字的時候可以使用字元流
- 讀取的時候是按照字元的大小讀取的,不會出現半個中文
- 寫出的時候可以直接將字串寫出,不用轉換為位元組陣列
21.05_IO流(字元流是否可以拷貝非純文字的檔案)
- 不可以拷貝非純文字的檔案
- 因為在讀的時候會將位元組轉換為字元,在轉換過程中,可能找不到對應的字元,就會用?代替,寫出的時候會將字元轉換成位元組寫出去
- 如果是?,直接寫出,這樣寫出之後的檔案就亂了,看不了了
21.06_IO流(自定義字元陣列的拷貝)
FileReader fr = new FileReader("aaa.txt"); //建立字元輸入流,關聯aaa.txt FileWriter fw = new FileWriter("bbb.txt"); //建立字元輸出流,關聯bbb.txt int len; char[] arr = new char[1024*8]; //建立字元陣列 while((len = fr.read(arr)) != -1) { //將資料讀到字元陣列中 fw.write(arr, 0, len); //從字元陣列將資料寫到檔案上 } fr.close(); //關流釋放資源 fw.close();
21.07_IO流(帶緩衝的字元流)
- BufferedReader的read()方法讀取字元時會一次讀取若干字元到緩衝區, 然後逐個返回給程式, 降低讀取檔案的次數, 提高效率
- BufferedWriter的write()方法寫出字元時會先寫到緩衝區, 緩衝區寫滿時才會寫到檔案, 降低寫檔案的次數, 提高效率
BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); //建立字元輸入流物件,關聯aaa.txt BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt")); //建立字元輸出流物件,關聯bbb.txt int ch; while((ch = br.read()) != -1) { //read一次,會先將緩衝區讀滿,從緩衝去中一個一個的返給臨時變數ch bw.write(ch); //write一次,是將資料裝到字元陣列,裝滿後再一起寫出去 } 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系統 bw.newLine(); //跨平臺的 } br.close(); bw.close();
21.09_IO流(將文字反轉)
- 將一個文字文件上的文字反轉,第一行和倒數第一行交換,第二行和倒數第二行交換
21.10_IO流(LineNumberReader)
- LineNumberReader是BufferedReader的子類, 具有相同的功能, 並且可以統計行號
- 呼叫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 HeiMaStudent implements Coder { private Student s; //獲取到被包裝的類的引用 public ItcastStudent(Student s) { //通過建構函式建立物件的時候,傳入被包裝的物件 this.s = s; } @Override public void code() { //對其原有功能進行升級 s.code(); System.out.println("資料庫"); System.out.println("ssh"); System.out.println("安卓"); System.out.println("....."); } }
21.12_IO流(使用指定的碼錶讀寫字元)
- FileReader是使用預設碼錶讀取檔案, 如果需要使用指定碼錶讀取, 那麼可以使用InputStreamReader(位元組流,編碼表)
- FileWriter是使用預設碼錶寫出檔案, 如果需要使用指定碼錶寫出, 那麼可以使用OutputStreamWriter(位元組流,編碼表)
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流(獲取文字上字元出現的次數)
- 獲取一個文字上每個字元出現的次數,將結果寫在times.txt上
21.15_IO流(試用版軟體)
- 當我們下載一個試用版軟體,沒有購買正版的時候,每執行一次就會提醒我們還有多少次使用機會用學過的IO流知識,模擬試用版軟體,試用10次機會,執行一次就提示一次您還有幾次機會,如果次數到了提示請購買正版
21.16_File類(遞迴)
- 5的階乘
21.17_File類(練習)
- 需求:從鍵盤輸入接收一個資料夾路徑,打印出該資料夾下所有的.java檔名
21.18_IO流(總結)
- 1.會用BufferedReader讀取GBK碼錶和UTF-8碼錶的字元
- 2.會用BufferedWriter寫出字元到GBK碼錶和UTF-8碼錶的檔案中
- 3.會使用BufferedReader從鍵盤讀取一行