转换流解决拷贝文件乱码问题
"新手初学欢迎指正~"
编码表
-
GBK:国标码, 定义的是英文字符和中文字符,在GBK编码表下,英文占一个字节, 中文占两个字节;
-
UTF-8:万国码,定义全球所有国家预言符号,定义了这些符号和数字之间的对应关系,英文占一个字节,中文符号占三个字节.
转换流
-
OutputStreamWriter:字符流通向字节流的桥梁, 使用它可以把一个字符信息转为字节信息,并且可以指定转换时参照的编码表;
构造方法:OutputStreamWriter(OutputStream os, String charsetName):创建一个转换流对象,可以把将来方法中接收的字符信息,通过执行编码表转为字节信息.
使用:直接使用Writer类型中定义方法即可,因为它是Writer子类.
-
InputStreamReader:字节流通向字符流的桥梁,使用可以把字节信息转为字符信息,并且可以指定转换时参照的编码表
构造方法:InputStreamReader(InputSream is, String charsetName):创建一个转换流对象,可以把将来方法中读取到字节信息,按照指定编码表转为字符信息.
使用:直接使用Reader类型定义方法即可,因为它是Reader的子类
-
使用说明:
无论是读取还是写出,一定要保证流对象使用字符集和文件的字符集一致就可以了.这样一定不会乱码.
读取的文件的时候,指定字符集和读取文件的字符集一致,只有这样才能把读取到字节转字符,才能解码成功.
写出文件的时候,指定字符集和目标文件字符集一致,只有这样才能把写出字符转成正确字节信息,才能编码成功.
示例:文件x.txt为GBK编码,y.txt为UTF-8编码.默认编码形式为GBK
- GBK到UTF-8的拷贝
public static void test_字节流的拷贝() throws FileNotFoundException, IOException {
//GBK到utf-8字节流的拷贝
//将文件x.txt的字节信息("鸿蒙操作系统"6个字编码为12个字节)拷贝到y.txt文件中,
//但是打开时将三个字节一组解码成字符
//拷贝结果y.txt文件乱码
FileInputStream fis = new FileInputStream("x.txt");
FileOutputStream fos = new FileOutputStream("y.txt");
int i;
while((i= fis.read()) != -1) {
fos.write(i);
}
fis.close();
fos.close();
}
public static void test_字符流的拷贝() throws FileNotFoundException, IOException {
//GBK到utf-8字符流的拷贝
//字符输入先将字节信息转为字符读取到内存中;字符输出流把字符转为字节写出到目标文件.
//拷贝结果y.txt文件乱码
FileReader fr = new FileReader("x.txt");
FileWriter fw = new FileWriter("y.txt");
int i;
while((i = fr.read()) != -1) {
fw.write(i);
}
fr.close();
fw.close();
}
结果:
-
UTF-8到GBK的拷贝
public static void test_uft8Togbk字符流的拷贝() throws FileNotFoundException, IOException { //utf-8到GBK字符流的拷贝 //将文件y.txt的字节信息("中国华为"4个字编码为12个字节)拷贝到x.txt文件中, //但是打开时将两个字节一组解码成字符 //拷贝结果x.txt乱码 FileReader fr = new FileReader("y.txt"); FileWriter fw = new FileWriter("x.txt"); int i; while((i = fr.read()) != -1) { fw.write(i); } fr.close(); fw.close(); } public static void test_utf8Togbk字节流拷贝() throws FileNotFoundException, IOException { //utf-8到GBK字节流的拷贝 //拷贝结果x.txt乱码 FileInputStream fis = new FileInputStream("y.txt"); FileOutputStream fos = new FileOutputStream("x.txt"); int i; while((i= fis.read()) != -1) { fos.write(i); } fis.close(); fos.close(); }
结果:
-
字节到字符的转换流
将UTf-8文件信息拷贝到GBK文件下
public static void test_字节到字符的转换流() throws UnsupportedEncodingException, FileNotFoundException, IOException { //字节转字符的转换流InputStreamReader() //使用FileInputStream字节输入流,从磁盘读取字节信息,根据指定的编码形式utf-8转为字符信息 InputStreamReader isr = new InputStreamReader(new FileInputStream("y.txt"),"utf-8"); FileWriter fw = new FileWriter("x.txt"); int i; while((i = isr.read()) != -1) { fw.write(i); } isr.close(); fw.close(); }
将y.txt文件字节信息从磁盘里读取,然后根据utf-8的编码形式三个字节一组解码成字符信息到内存中,之后字符输出流将字符信息按照x.txt的GBK编码形式两个字节一组编码成字节信息存储在x.txt文件中.再打开x.txt文件就不是乱码了.
结果:
4.字符到字节的转换流
将GBK文件信息拷贝到UTf-8文件下
public static void test_字符到字节的转换流() throws IOException {
//目标文件是用字节存储文件的,当使用文本编辑器读取文件时,先读取数据,然后通过编码表进行解码,让我们看到字符
//使用OutputStreamWriter转换流,将接收到的字符(GBK编码),按照指定编码形式utf-8编码为字节信息
FileReader fr = new FileReader("x.txt");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("y.txt"),"utf-8");
int i;
while((i = fr.read()) != -1) {
osw.write(i);
}
fr.close();
osw.close();
}
将内存中的字符信息按照UTF-8的编码形式编码为字节文件
结果: