IO流(四)高级流——>转换流

(2)转换流

---1、转换流基本用法
转换流

是字符流的子类,是字符流和字节流之间的桥梁,创建转换流对象(InputStreamReader)会包装一个字节流,转换流可以让该字节流变成字符流,让它拥有字符流的特性。比如:可以根据字符集一次读取多个字节,读取数据不会乱码了。而当要拷贝到文件时,创建OutputStremWriter会将字符流再次转换为字节流存入文件。

注:转换流InputStreamReader的父类是Reader,而关键:FileReader字符输入流的父类是转换流,同理输出流也一样
转换流的应用场景

1、指定字符集读写

2、字节流想要使用字符流中的方法

转换流构造方法

//构造1:默认平台编码InputStreamReader(InputStream in)

//构造2:指定编码【重点】InputStreamReader(InputStream in, String charsetName)

底层原理:

---2、转换流练习
(1)将本地文件中的GBK文件,转成UTF-8

JDK11以前必须创建转换流对象,利用转换流指定字符编码读写 I nputStreamReader isr = new InputStreamReader(new FileInputStream("opp-IO\\Text.txt"),"GBK");这是非常麻烦的,所

而在JDK11以后出现了替代方法

FileReader字符输入流的父类是转换流InputStreamReader, 而InputStreamReader在JDK11出现了新的构造方法 public InputStreamReader(File file, Charset charset) 该方法的第二个参数调用Charset里面的静态方法forName是用来指定字符编码的 所以转换流的子类FileReader继承子类构造方法,也可以用这种构造方法

所以要转换本地文件编码类型,不用在创建转换流对象,

FileWriter fw = new FileWriter("opp-IO\\c.txt", Charset.forName ("GBK"));

java 复制代码
package ConvertStream;

import java.io.*;
import java.nio.charset.Charset;

public class ConvertStreamDemo1 {
    public static void main(String[] args) throws IOException {
        /*
        利用转换流按照指定字符编码读取(了解即可)
        因为有替代方法JDK11以后
         */
        //1.创建对象并指定字符编码
//        InputStreamReader isr = new InputStreamReader(new FileInputStream("opp-IO\\Text.txt"),"GBK");
//        //2.读取数据
//        int ch;
//        while ((ch = isr.read()) != -1) {
//            System.out.print((char)ch);
//        }
//        isr.close();
        /*
        JDK11以后得替代方法
        FileReader字符输入流的父类是转换流InputStreamReader,
        而InputStreamReader在JDK11出现了新的构造方法
        public InputStreamReader(File file, Charset charset)
        该方法的第二个参数调用Charset里面的静态方法forName是用来指定字符编码的
        所以转换流的子类FileReader继承子类构造方法,也可以用这种构造方法
         */
        FileReader fr = new FileReader("opp-IO\\Text.txt", Charset.forName("GBK"));
        int ch;
        while ((ch = fr.read()) != -1) {
            System.out.print((char)ch);
        }
        fr.close();
        /*
           利用转换流按照指定字符编码写出(旧的方法了解即可)
           因为有替代方法
         */
//        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("opp-IO\\c.txt"),"GBK");
//        osw.write("我是帅哥");
//        osw.close();
        FileWriter fw = new FileWriter("opp-IO\\c.txt", Charset.forName("GBK"));
        fw.write("我是帅哥");
        fw.close();
    }
}

最终代码

java 复制代码
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;

public class ConvertStreamDemo2 {
    public static void main(String[] args) throws IOException {
        /*
        将本地文件中的GBK文件,转成UTF-8;
         */
        FileReader fr = new FileReader("opp-IO\\Text.txt", Charset.forName("GBK"));
        FileWriter fw = new FileWriter("opp-IO\\c.txt", Charset.forName("UTF-8"));
        int len;
        char[] chars = new char[1024];
        while((len = fr.read(chars)) != -1) {
            fw.write(chars, 0, len);
        }
        fw.close();
        fr.close();
    }
}
(2)用字节流读取文件数据(不能出现乱码)

利用字节流读取文件中的数据,每次读一整行,而且不能出现乱码

//1、字节流在读取中文的时候,是会出现乱码的,但是字符流可以搞定

//2、字节流里面是没有读一整行的方法的,只有字符缓冲流才能搞定

此时可以利用转换流将字节流转成字符流

InputStreamReader(字节输入流,"编码")

OutputStreamWriter(字节输出流,"编码")

转换流 = 字节流 + 编码参数

java 复制代码
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class ConvertStreamDemo3{
    public static void main(String[] args) throws IOException {
        /*
            利用字节流读取文件中的数据,每次读一整行,而且不能出现乱码
            //1、字节流在读取中文的时候,是会出现乱码的,但是字符流可以搞定
            //2、字节流里面是没有读一整行的方法的,只有字符缓冲流才能搞定
         */
        /*FileInputStream fis = new FileInputStream("opp-IO\\a.txt");
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader br = new BufferedReader(isr);
        String str = br.readLine();
        System.out.println(str);
        br.close(); */

        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("opp-IO\\a.txt")));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        br.close();

    }
}