美文网首页
IO流之转换流

IO流之转换流

作者: 程序员小杰 | 来源:发表于2020-08-23 20:12 被阅读0次

上一篇:IO流之缓冲流 https://www.jianshu.com/p/f80daa6fe45f

在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编码的文件呢?

1、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):写一个字符串的一部分。

1.1 构造方法(常用)

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

1.2 参数

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

1.3 指定编码写出

 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软件打开文件


image.png

2、InputStreamReader

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

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

2.1 构造方法(常用)

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

2.2 参数

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

2.3 指定编码读取

 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));
        }
    }
结果:
我好棒棒哦

相关文章

  • Java学习笔记 20 - 转换流、缓冲流

    本文主要内容1、转换流2、缓冲流3、各种流文件复制方式的效率比较4、IO流对象的操作规律 01转换流 A: 转换流...

  • IO流之转换流

    上一篇:IO流之缓冲流 https://www.jianshu.com/p/f80daa6fe45f[https:...

  • IO流---转换流

    我们在使用字符流操作数据的时候,使用的是默认的编码表,当我们想自己手动更换编码表时,java为我们提供了转换流对象...

  • IO流——转换流

    处理流之二:转换流的使用 转换流 属于字符流 InputStreamReader:将一个字节的输入流转换为字符的输...

  • IO流

    一、IO流的概述: 二、IO流的分类: 三、字节缓冲流: 四、字符缓冲流: 五、转换流(把字节流转换为字符流): ...

  • IO流之随机访问流和转换流

    本文介绍java IO几种比较重要的流,随机访问流,转换流。 一、随机访问流 RandomAccessFi...

  • IO流----编码----转换流

    InputStream(抽象的)字节输入流顶层父类 FileInputStream子类:构造方法: 1.输入流如果...

  • IO流之转换流(处理流之二)

    处理流之二:转换流 转换流:属于字符流InputStreamReader:将一个字节的输入流转换为字符的输入流Ou...

  • Java IO之转换流和缓存流

    1 转换流   在学习字符流(FileReader、FileWriter)的时候,其中说如果需要指定编码和缓冲区大...

  • IO流学习总结-转换流

    转换流 字节流转换为字符流 通过字符流OutputStreamWriter,InputStreamReader 将...

网友评论

      本文标题:IO流之转换流

      本文链接:https://www.haomeiwen.com/subject/zfdwjktx.html