IO流之转换流(六)

280 阅读3分钟

这是我参与更文挑战的第 14 天,活动详情查看: 更文挑战

日积月累,水滴石穿 😄

在 IDEA 中,使用 FileReader读取项目中的文本文件。由于IDEA的设置,都是默认的 UTF-8 编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是 GBK 编码,就会出现乱码。

public static void main(String[] args) throws Exception {
    FileReader fr = new FileReader("IO流\\GBK.txt");
    char[] c = new char[6];
    int len = 0;
    while ( (len = fr.read(c) ) != -1){
        System.out.println(new String(c));
    }
}

结果:
������
������
������

那么如何读取GBK编码的文件呢?

一、InputStreamReader

InputStreamReaderReader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。(解码:把看不懂的变成能看懂的,字节转换为字符)

继承自父类的成员方法:

  • void close():关闭流并释放与之相关联的任何系统资源。
  • int read():读一个字符
  • int read(char[] cbuf, int off, int len):将字符读入数组的一部分。

构造方法(常用)

  • InputStreamReader(InputStream in):创建一个使用默认字符集的InputStreamReader
  • InputStreamReader(InputStream in, String charsetName):创建一个使用命名字符集的InputStreamReader

参数

  • InputStream in:字节输入流,用来读取文件中保存的字节
  • String charsetName:指定编码表名称,不区分大小写,不指定默认使用UTF-8

指定编码读取

public static void main(String[] args) throws Exception {
    InputStreamReader isr = new InputStreamReader(new FileInputStream("IO流\\GBK.txt"));

    int len = 0;
    char[] c = new char[1024];
    while ((len = isr.read(c)) != -1){
        System.out.println(new String(c));
    }
}

结果:
�Һð���Ŷ

乱码。这是因为 UTF-8 的编码是不能读取 GBK 编码文件的。下面来指定编码读取:

public static void main(String[] args) throws Exception {
    InputStreamReader isr = new InputStreamReader(new FileInputStream("IO流\\GBK.txt"),"GBK");

    int len = 0;
    char[] c = new char[1024];
    while ((len = isr.read(c)) != -1){
        System.out.println(new String(c,0,len));
    }
}
结果:
我好棒棒哦

二、OutputStreamWriter

java.io.OutputStreamWriter,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。(编码:把能看懂的变成看不懂,字符转换为字节)

继承自父类的成员方法:

  • abstract void close():关闭流,但要先刷新。
  • abstract void flush():刷新流。
  • void write(int c):写一个字符
  • void write(char[] cbuf):写入一个字符数组。
  • void write(char[] cbuf, int off, int len):写入字符数组的一部分。
  • void write(String str):写一个字符串
  • void write(String s, int off, int len):写一个字符串的一部分。

构造方法(常用)

  • OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的 OutputStreamWriter
  • OutputStreamWriter(OutputStream out, String charsetName) 创建一个使用命名字符集的 OutputStreamWriter

参数

  • OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
  • String charsetName:指定编码表名称,不区分大小写,不指定默认使用UTF-8 构造举例,代码如下:
OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("a.txt")); 
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("a.txt") , "GBK");

指定编码写出

public static void main(String[] args) throws Exception {
   //创建FileOutputStream对象,构造方法传递写入数据目的地
    FileOutputStream os = new FileOutputStream("IO流\\GBK.txt");
  //创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
    OutputStreamWriter osw = new OutputStreamWriter(os,"GBK");
    //使用OutputStreamWriter中的方法write,把字符转换为字节保存到缓冲区中
    osw.write("我好棒棒哦");
    //使用OutputStreamWriter中的方法flush,将缓冲区的字节刷新到文件中
    osw.flush();
    //释放资源
    osw.close();
}

使用IDEA软件打开文件,可以看到是乱码的,因为 IDEA 默认的编码为 UTF-8,而我创建文件是指定的编码格式为 GBKimage.png

  • 如你对本文有疑问或本文有错误之处,欢迎评论留言指出。如觉得本文对你有所帮助,欢迎点赞和关注。