java IO转换流:InputStreamReader,OutputStreamWriter

概述

字符编码

计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制
数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照
某种规则解析显示出来,称为解码 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本f符
号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。

文件一定是以字节的形式保存在计算机中的。。

程序写入文件的过程,反之亦然
在这里插入图片描述

InputStreamReader类

概念
转换流 java.io.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。

构造方法

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

由于本地的文件有可能是不同字符集的,所以读出的时候有可能出现乱码,如下实例,程序读取一个GBK字符集的文本,程序默认以UTF-8解码,所以无法输出真确结果

public class Demo {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("Demo//GBK.txt"));
        int read = 0;
        while ((read = isr.read()) !=-1) {
            System.out.print((char) read);
        }
    	isr.close();
    }
}

GBK.txt内容:gbk2个中文用4个字节表示
在这里插入图片描述
控制台输出结果:
在这里插入图片描述
由于用utf-8解码了gbk所以出现乱码

用InputStreamReader指定字符集解码
public class Demo {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("Demo//GBK.txt"),"gbk");
        int read = 0;
        while ((read = isr.read()) !=-1) {
            System.out.print((char) read);
        }
        isr.close();
    }
}

输出正常结果:因为用了gbk字符集解码gbk,所以输出结果正确。
在这里插入图片描述

OutputStreamWriter类

转换流 java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
构造方法

  • OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
  • OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流。

用OutputStreamWriter写入GBK字符到GBK.txt中,并用InputStreamReader解码打印

package WriteAndreader;

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException {
        //创建输出和输入的转换流对象,指定GBK.txt文件,用GBK格式写入,再用GBK格式读出
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("Demo//GBK.txt"), "GBK");
        InputStreamReader isr = new InputStreamReader(new FileInputStream("Demo//GBK.txt"), "GBK");
        //写入数据,用flush刷新
        String str = "转换流测试专用";
        osw.write(str);
        osw.flush();
        //去除文件内的内容,遍历打印
        int len;
        while ((len = isr.read()) != -1) {
            System.out.println((char)len);
        }
        //记得释放资源
        isr.close();
        osw.close();
    }
}

输出正确的结果:
在这里插入图片描述
以上案例以及证明了这两个类具有编码和解码的功能,这就是转换流类,

下期讲序列化流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值