-转换流-

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

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

转换流的位置:

-转换流-_第1张图片
分为两个:
字符转换输入流:InputStreamReader
将InputStream转换为Reader
字符转换输出流:OutputStreamWriter
将Writer转换为OutputStream


作用:

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

-转换流-_第2张图片


用两个练习了解转换流:

练习一:
-转换流-_第3张图片

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

1.首先准备一段用GBK编码的文本
-转换流-_第4张图片
image.png
放在idea中会乱码,因为idea默认使用UTF-8编码规则
-转换流-_第5张图片

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:
-转换流-_第6张图片


练习二:
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:
-转换流-_第7张图片
读取结果:
-转换流-_第8张图片

你可能感兴趣的:(java)