1编码引出的问题 --FileReader读取GBK格式的文件 会乱码 相当于ide默认的utf-8读取GBK编码的汉字 表示的字节不同会报错
FileReader可以读取IDE默认编码格式UTF-8的文件, 但是FileReader读取系统默认编码(中文系统默认GBK格式)会产生乱码
package demo01;
import java.io.FileReader;
import java.io.IOException;
/*
FileReader可以读取IDE默认编码格式UTF-8的文件,
但是FileReader读取系统默认编码(中文系统默认GBK格式)会产生乱码
*/
public class Demo01FileReader {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("D:\\IdeaProjects\\新建文件夹\\GBK格式的文本.txt");
int len = 0;
char[] chars = new char[1024];
while((len=fr.read(chars))!=-1){
System.out.println(new String(chars));
}
fr.close();
}
}
2.转换流的原理
注意:
FileReader
1.其实所有的底层都是FileInputStream来读的,先读取到字节 再FileReader(这个时候用的UTF-8来解码的来read的)把字节转换为字符(相当于解码)
但是如果存储的是GBK格式,则FileInputStream读取的字节时Gbk格式 但是FileReader仍然用UTF-8来,则会产生乱码(编码和解码不对应,会乱码所以FileReader只能读取ide默认格式编码的文件)
不用FileReader读了用InputStreamReader来读既可以查询默认的UTF-8又可以查询指定的码表比如GBK或者其他的
2.FileWriter
只能查询Ide的默认码表,吧字符转换为字节(编码把看懂的转换成看不懂的)还是会用到FileOutputStream依次把字节写入到硬盘中(只能写Utf-8)
如果要写GBK格式的文件
用OutputStreamWriter 既可以把字符转化为默认的又可以转化为指定的码表 ,然后FileOutputStream写入到硬盘中(注意FileOutputStream只能写UTF-8)