乱码问题引入
文本文件的编码为 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
编码读取的,所以中文问题会有乱码
转换流 InputStreamReader
和 OutputStreamWriter
介绍
InputStreamReader
:Reader
的子类,可以将InputStream
(字节流)包装成(转换)Reader
(字符流)OutputStreamWriter
:Writer
的子类,实现将OutputStream
(字节流)包装成Writer
(字符流)- 当处理纯文本数据时,如果使用字符流,效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
- 可以在使用时指定编码格式(比如
utf-8,gbk,gb2312,ISO8859-1
等)
转换流 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
练习
应用案例:
编程将字节流 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 + " 保存文件成功!");
}
}