亂碼問題引入
文本檔案的編碼為
ANSI【國标碼,對應我國為 GBK】
,然後通過
BufferedReader
字元流讀取檔案。
package day06.codeQuestion;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/**
* @Author: Gin
* @Description:
* @Modified By: Gin
* @Date: Created in 17:32 2021/9/3
*/
public class Demo {
public static void main(String[] args) throws IOException {
// 要讀取的檔案
String filePath = "E:\\news1.txt";
// 1. 建立字元流 BufferedReader【處理流】
// 2. 預設情況下,讀取檔案是按照 UTF-8 編碼方式
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
String line = bufferedReader.readLine();
System.out.println("line = " + line);
// 關閉流
bufferedReader.close();
}
}
由于預設情況下讀取檔案是按照
UTF-8
編碼讀取的,是以中文問題會有亂碼
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnLmZ2Y4E2MhZ2Y4ETY5MTZhZGZ1QzYzkTOwYWMmJ2N3gzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
轉換流 InputStreamReader
和 OutputStreamWriter
介紹
InputStreamReader
OutputStreamWriter
-
:InputStreamReader
的子類,可以将Reader
(位元組流)包裝成(轉換)InputStream
(字元流)Reader
-
:OutputStreamWriter
的子類,實作将Writer
(位元組流)包裝成OutputStream
(字元流)Writer
- 當處理純文字資料時,如果使用字元流,效率更高,并且可以有效解決中文問題,是以建議将位元組流轉換成字元流
- 可以在使用時指定編碼格式(比如
等)utf-8,gbk,gb2312,ISO8859-1
轉換流 InputStreamReader
練習
InputStreamReader
對開頭的亂碼問題進行優化:
将位元組流
FilelnputStream
包裝成(轉換成)字元流
InputStreamReader
,對檔案進行讀取(按照
utf-8/gbk
格式),進而再包裝成
BufferedReader
來提高讀取效率。
以上各類之間的關系如圖:
package day06.codeQuestion;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @Author: Gin
* @Description: 解決亂碼問題
* @Modified By: Gin
* @Date: Created in 19:45 2021/9/3
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
// 要讀取的檔案
String filePath = "E:\\news1.txt";
// 1. 将 FileInputStream 包裝成(轉換成)InputStreamReader
// 2. 指定編碼 GBK。指定的編碼要與檔案本身的編碼一緻
// InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "GBK");
// 3. 把 InputStreamReader 對象傳給 BufferedReader
// BufferedReader br = new BufferedReader(isr);
// 将以上 2 和 3 合并
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "GBK"));
// 4. 讀取檔案
String line = br.readLine();
System.out.println("line = " + line);
// 5. 關流
br.close();
}
}
輸出結果:
轉換流 OutputStreamWrriter
練習
OutputStreamWrriter
應用案例:
程式設計将位元組流
FileOutputStream
包裝成(轉換成)字元流
OutputStreamWriter
,對檔案進行寫入(按照
gbk
格式,可以指定其他,比如
utf-8
),這裡沒有用到 BufferedWriter。
package day06.codeQuestion;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/**
* @Author: Gin
* @Description: 轉換流 OutputStreamWrriter 練習
* @Modified By: Gin
* @Date: Created in 20:07 2021/9/3
*/
public class Demo2 {
public static void main(String[] args) throws IOException {
String filePath = "E:\\news5.txt";
String charSet = "UTF-8";
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath, true), charSet);
// BufferedWriter bw = new BufferedWriter(osw);
// bw.write("Gin琴酒");
// bw.close();
osw.write("Gin琴酒");
osw.close();
System.out.println("按照 " + charSet + " 儲存檔案成功!");
}
}