Java IO流(三) FileReader和FileWriter
阿新 • • 發佈:2020-11-27
1.為什麼需要字元流?
在使用InputStream或OutputStream處理文字型別的資料,時如果每次讀取的位元組數如果設定的不正確就會出現亂碼,而原因是中文字元和因為字元所佔位元組不一樣導致,例如中文字元在utf-8編碼下每個字佔3字元,當我們每次讀取的位元組數不是3的倍數,就會出現某個漢字缺少資料造成亂碼。
解決這個問題的辦法要麼更改剛好合適的位元組數,那麼有沒有更簡單的辦法呢,答案是 有 ,使用字元流
2.什麼是字元流
字元流和位元組流的區別可以從字面上來理解,使用位元組流每次處理的資料以位元組為單位,而字元流每次處理以字元為單位,有了字元流就能保證每次能剛好讀取一個整個字元,媽媽再也不用擔心我亂碼了。Reader和Writer是所有字元流的基類
Writer在寫入資料時會使用當前平臺(作業系統)的預設編碼
3.FileReader字元輸入流
FileReader是專門用來處理字元型別資料的流,FileReader繼承Reader而Reader類有如下幾個讀資料會用到的方法:
- int read():每次讀取一個字元,並把它轉換為 0~65535 的整數,然後返回讀取到的字元。讀到末尾返回-1。(為了提高 I/O 操作的效率,建議儘量使用下面兩種read()方法)
- int read(char[] cbuf):將讀取到的多個字元儲存到 cbuf 中,然後返回讀取的字元,讀到末尾時返回-1。
- int read(char[] cbuf,int off,int len):將讀取到的多個字元儲存進字元陣列 cbuf,從索引 off 開始,長度為len字元,返回結果為讀取的字元數.
使用FileReader讀取txt檔案內容
package com.mike.io.eg; import java.io.IOException; import java.io.File; import java.io.FileReader; import java.io.InputStreamReader; /** * @author mike * @date 2020-11-26 * @desc 檔案字元輸入流demo */ public class FileReaderDemo { public static void main(String[] args) { //定義輸入流 FileReader fr = null; try { //建立檔案物件 File file = new File("F:\\foo.txt"); //2、建立輸入流物件 fr = new FileReader(file); int len = 0; char[] buffer = new char[1]; //每次讀取一個字元 while((len = fr.read(buffer)) != -1) { System.out.println(new String(buffer,0,len)); } } catch(IOException e) { e.printStackTrace(); }finally { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } }
4.FileWriter輸出流
FileWriter是專門用來處理字元型別資料的流,FileWriter繼承Writer而Writer類有如下幾個寫資料會用到的方法:
- void write(int c):把一個字元寫入到檔案中。
- void write(char[] cbuf):把cbuf字元陣列寫入到檔案中。
- void write(char[] cbuf,int off,int len):把部分字元陣列寫入到檔案中,從 cbuf 陣列的 off 索引開始,寫入len個字元。
- void write(String str):把一個字串寫入到檔案中。
- void write(String str,int off,int len):把部分字串寫入到檔案中,從 字串的 off 索引開始,寫入len個字元。
使用FileWriter向txt檔案寫入資料
package com.mike.io.eg;
import java.io.File;
import java.io.IOException;
import java.io.FileWriter;
/**
* @author mike
* @date 2020-11-26
* @desc 字元輸出流demo
*/
public class FileWriterDemo {
public static void main(String[] args) {
FileWriter fw = null;
try {
File file = new File("F:\\foo.txt");
fw = new FileWriter(file);
fw.write("我是中國人");
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}