1. 程式人生 > 實用技巧 >Java IO流(三) FileReader和FileWriter

Java IO流(三) FileReader和FileWriter

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();
			}
		}
	}
}