转换流解决拷贝文件乱码问题

转换流解决拷贝文件乱码问题

								"新手初学欢迎指正~"

编码表

  1. GBK:国标码, 定义的是英文字符和中文字符,在GBK编码表下,英文占一个字节, 中文占两个字节;

  2. UTF-8:万国码,定义全球所有国家预言符号,定义了这些符号和数字之间的对应关系,英文占一个字节,中文符号占三个字节.

转换流

  1. OutputStreamWriter:字符流通向字节流的桥梁, 使用它可以把一个字符信息转为字节信息,并且可以指定转换时参照的编码表;

    构造方法:OutputStreamWriter(OutputStream os, String charsetName):创建一个转换流对象,可以把将来方法中接收的字符信息,通过执行编码表转为字节信息.

​ 使用:直接使用Writer类型中定义方法即可,因为它是Writer子类.

  1. InputStreamReader:字节流通向字符流的桥梁,使用可以把字节信息转为字符信息,并且可以指定转换时参照的编码表

    构造方法:InputStreamReader(InputSream is, String charsetName):创建一个转换流对象,可以把将来方法中读取到字节信息,按照指定编码表转为字符信息.

    使用:直接使用Reader类型定义方法即可,因为它是Reader的子类

  2. 使用说明:

    无论是读取还是写出,一定要保证流对象使用字符集和文件的字符集一致就可以了.这样一定不会乱码.

    读取的文件的时候,指定字符集和读取文件的字符集一致,只有这样才能把读取到字节转字符,才能解码成功.

    写出文件的时候,指定字符集和目标文件字符集一致,只有这样才能把写出字符转成正确字节信息,才能编码成功.

示例:文件x.txt为GBK编码,y.txt为UTF-8编码.默认编码形式为GBK
  1. 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();
	}

结果:
在这里插入图片描述

  1. 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();
    	}
    

    结果:

在这里插入图片描述

  1. 字节到字符的转换流

    将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的编码形式编码为字节文件

结果:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值