一.乱码问题
使用 FileReader
读取文件时,可以正常读取IDE默认编码格式(UTF-8)的文件,但若读取系统默认编码(中文GBK)则会产生乱码如: ���。当用记事本写入内容并保存为不同的编码时其保存的二进制码也是不同的,如UTF-8编码使用3个字节保存一个中文,GBK用2个字节保存一个中文。FileReader
底层为 FileInputStream
,在以字节流的方式读入后查询IDE默认码表,并用此码表进行转换,因此若文件保存为GBK,而 FileReader
使用 UTF-8 进行解码,二者并不匹配,因此产生乱码。
同样的,在使用 FileWriter
进行文件写入时,其首先查询IDE默认编码表,将字符转换为字节,再利用 FileOutPutStream
将字节流输入文件,此时文件内的编码即为IDE默认编码,而若想更改编码类型,则可以使用 OutputStreamWriter
指定编码表进行输出。
二.转换流转换流程图示
使用 InputStreamReader
进行转换时可自行指定编码表,从而防止乱码

使用 OutputStreamWriter
可自行指定文件保存所用编码表

三. OutputStreamWriter 的使用
OutputStreamWriter
继承自 BufferedOutputStream
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("out.txt"),"gbk");
outputStreamWriter.write("中文你好");
outputStreamWriter.flush();
outputStreamWriter.close();
四. InputStreamReader 的使用
InputStreamReader
继承自 BufferedInputStream
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("test.txt"),"gbk");
int len = 0;
while((len = inputStreamReader.read())!=-1){
System.out.print((char)len);
}
inputStreamReader.close();
五.实现文本编码转换器
File file = new File("out.txt");//原文件
File temp = new File("temp.txt"); //暂存文件
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file),"gbk");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(temp),"utf-8");
int len = 0;
while((len = inputStreamReader.read())!=-1){
outputStreamWriter.write(len);
}
inputStreamReader.close();
outputStreamWriter.close();
file.delete();//删除原文件
temp.renameTo(new File("out.txt"));//重命名暂存文件
Comment