【字符转换流】概述、使用以及应用场景

字符转换流的概述与使用

1.不同编码读取出现乱码的问题

  • 如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码
  • 如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码

2.字符输入转换流

(1)作用:指定编码读。解决了不同编码读取数据,出现乱码的问题

(2)解决思路:先获取文件的原始字节流,再将其按真实的字符集编码成字符输入流,这样字符输入流中的字符就不乱码了

(3)构造器

  • public InputStreamReader(InputStream is):把原始的字节输入流,按照代码默认编码转成字符输入流
  • public InputStreamReader(InputStream is,String charset):把原始的字节输入流,按照指定字符集编码转成字符输入流
package com.demo09_IO流_字符输入转换流;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class Demo {
    public static void main(String[] args) throws Exception {
//        //创建原始流,关联文件
//        FileInputStream fis = new FileInputStream("day10\\Demo09.txt"); //Demo09文件是GBK
//        //创建转换流,指定字符集
//        InputStreamReader isr = new InputStreamReader(fis,"GBK");
//        //创建缓冲流,提升效率
//        BufferedReader br = new BufferedReader(isr);
        //按照指定字符集编码GBK转成字符输入流
         BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("day10\\Demo09.txt"),"GBK"));
        //按照代码默认编码转成字符输入流
         BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("day10\\Demo09.txt")));
        //读数据并展示
        System.out.println(br.readLine()); //Demo09字符集是GBK,Demo09字符集是GBK
        //释放资源
        br.close();
    }
}

3.字符输出转换流

(1)作用:指定编码写,控制写出去数据的字符集

(2)解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,写出去的字符就会用该字符集编码了

(3)构造器

  • public OutputStreamWriter(OutputStream os):可以把原始的字节输出流,按照代码默认编码转换成字符输出流
  • public OutputStreamWriter(OutputStream os,String charset):可以把原始的字节输出流,按照指定编码转换成字符输出流
package com.demo10_IO流_字符输出转换流;
import java.io.*;
import java.nio.charset.Charset;
public class Demo1 {
    public static void main(String[] args) throws Exception {
//        //创建字节流,关联文件
//        FileOutputStream fos = new FileOutputStream("day10\\Demo01.txt");
//        //创建转换流,指定字符集写
//        OutputStreamWriter osr = new OutputStreamWriter(fos,"GBK");
//        //创建缓冲流,提升性能
//        BufferedWriter bw = new BufferedWriter(osr);
         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("day10\\Demo01.txt"),"GBK"));
        //写数据
        bw.write("郝佳乐"); //郝佳乐,内容是GBK
        //释放资源
        bw.close();
    }
}

(4)还可以调用String的getBytes方法,先指定字符集将数据编码,然后写出去

package com.demo10_IO流_字符输出转换流;
import java.io.*;
public class Demo2 {
    public static void main(String[] args) throws Exception {
        byte[] bytes = "郝佳乐".getBytes("GBK");
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day10\\Demo02.txt"));
        bos.write(bytes)
        bos.close();
    }
}

(5)JDK11开始,可直接使用字符流构造指定字符集,构造第二个参数,通过Charset的静态方法forName指定字符集

  • public FileReader(String fileName,Charset charset) throws IOException
  • public FileWriter(String fileName,Charset charset) throws IOException
package com.demo10_IO流_字符输出转换流;
import java.io.*;
import java.nio.charset.Charset;
public class Demo3 {
      public static void main(String[] args) throws Exception {
      //指定编码读
      BufferedReader br = new BufferedReader(new FileReader("day10\\Demo08.txt", Charset.forName("GBK")));
      System.out.println(br.readLine());
      br.close(); //我是GBK字符集的文件
      //指定编码写
      BufferedWriter bw = new BufferedWriter(new             FileWriter("day10\\Demo03.txt",Charset.forName("GBK")));
      bw.write("郝佳乐");
      bw.close();
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值