-转换流-

它是字节流和字符流之间转换的桥梁

转换流本身其实是字符流;

转换流的位置:

Snipaste_2024-02-09_09-35-03.png
分为两个:
字符转换输入流:InputStreamReader
将InputStream转换为Reader
字符转换输出流:OutputStreamWriter
将Writer转换为OutputStream


作用:

  1. InputStreamReader可将字节流先转换为字符流
    1. 可以指定字符集读写
    2. 可使用字符流中的方法了
  2. OutputStreamWriter可将字符流转为字节流

Snipaste_2024-02-09_09-40-02.png


用两个练习了解转换流:

练习一:
image.png

需求1:手动创建一个gbk的文件,把文件中的中文读取到内存中,不能出现乱码

1.首先准备一段用GBK编码的文本
image.png
image.png
放在idea中会乱码,因为idea默认使用UTF-8编码规则
image.png

2.题目要求不能出现乱码,我们可以使用字符流

题解:方法一、二

/*需求1:手动创建一个gbk的文件,把文件中的中文读取到内存中,不能出现乱码*/


//需求1:
//方法一:使用转化流(已过时)----
//第一个参数要创建对应的字节流对象,第二个参数要,要指定和文本编码规则相同的解码规则---GBK
InputStreamReader isr = new InputStreamReader(new FileInputStream("..\\ioDemo\\gbkfile.txt"), "GBK");
//读取数据
int b;
while ((b = isr.read()) != -1) {
    System.out.print((char) b);
}
isr.close();


System.out.println();
System.out.println("--------------");

//方法二:底层就是调用转换流
//参数1:放要读取的文件,
//参数2:调用forName方法指定解码规则GBK
FileReader fr=new FileReader("..\\ioDemo\\gbkfile.txt", Charset.forName("GBK"));
int c;
while((c=fr.read())!=-1){
    System.out.print((char) c);
}
fr.close();

控制台:
终于为那一身江南烟雨覆了天下
容华谢后,不过一场
今日无事,戏院听曲,插花弄玉

终于为那一身江南烟雨覆了天下
容华谢后,不过一场
今日无事,戏院听曲,插花弄玉


需求2:把一段中文按照gbk的方式写到本地文件

//方法一:
        /*//创建转化流对象
        //第一个参数要创建对应的字节流对象,第二个参数指定要写出的格式
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("..\\ioDemo\\a.txt"),"GBK");
        //写出数据
        osw.write("你好世界");
        //关流
        osw.close();*/


        //方法二:使用字符流,底层是使用转换流
        //创建字符流对象
        FileWriter fw=new FileWriter("..\\ioDemo\\a.txt", Charset.forName("GBK"));
        fw.write("你好世界");
        fw.close();

结果:
因为idea默认是UTF-8的解码方式,所以GBK格式的文本会出现乱码
image.png


需求3:将需求2的gbk文件,转成utf-8
思路:先用GBK解码规则读取GBK文件,然后用UTF-8编码方式写出文件


//方法一:
//创建转换流输入对象------读时候用GBK
/* InputStreamReader isr=new InputStreamReader(new FileInputStream("..\\ioDemo\\a.txt"),"GBK");
//创建转换流输出对象------输出时候用UTF-8
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("..\\ioDemo\\example.txt"),"UTF-8");//因为idea默认使用UTF-8所以可不写
//读写
int b;
while((b=isr.read())!=-1){
osw.write(b);
}
//关流
osw.close();
isr.close();*/

//方法二:
//使用字符流,底层是使用转换流
FileReader fr=new FileReader("..\\ioDemo\\a.txt",Charset.forName("GBK"));
FileWriter fw=new FileWriter("..\\ioDemo\\example.txt",Charset.forName("UTF-8"));因为idea默认使用UTF-8所以可不写
int b;
while((b=fr.read())!=-1){
fw.write(b);
}
fw.close();
fr.close();

a.txt:
image.png
example.txt:
image.png


练习二:
Snipaste_2024-02-09_09-41-46.png

问题:
1.字节流读取中文数据会有乱码—使用字符流解决
2.字节流没有读取一行数据的方法----使用字符字符缓冲流解决
思路:先将字节流 转为字符流 再转为字符缓冲流



        //创建字节流对象
        FileInputStream fis=new FileInputStream("..\\ioDemo\\csb2.txt");
        //创建转换流对象----将字节流转成字符流       转化流其实就是字符流所以可放入BufferedReader参数
        InputStreamReader isr=new InputStreamReader(fis);
        //将字符流包装成字符缓冲流
        BufferedReader br=new BufferedReader(isr);
        //循环读取每一行
        String s ;
        while((s= br.readLine())!=null){
            System.out.println(s);
        }
        //关流
        br.close();

csb2.txt:
image.png
读取结果:
image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成果、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值