转换流【字节流<--->字符流】

字符编码:

  • ​ 按照某种规则,将字符存储到计算机中,称为编码;反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。在进行编码和解码过程中,我们必须采用是同一种规则,才能数据正常,否则,会会导致乱码现象。

  • 字符编码:就是一套自然语言中的字符与二进制数之间的对应规则。
    字符集:

  • 字符集:是一个系统可支持的所有字符的集合,包括各国文字,标点符号,图形符号,数字等,也叫编码表。

  • 计算机中要准确的存储和识别各种文字的字符符号,需要进行字符编码,一套字符集至少有一个套字符编码

  • 常见的字符编码集有ASCII字符集、GBK字符集、Unicode字符集。

ASCII字符集:

  • ASCII是基于拉丁字母的一套编码系统,用于显示现代英语。
  • 基本的ASCII字符集,使用7位(bit)表示一个字符,共128个字符。ASCII的扩展字符集使用8位(bit)表示一个字符,共256个字符。
    ISO-8859-1字符集:
  • 拉丁码表,别名–Lantin-1,用于显示欧洲使用的语言,包括荷兰,丹麦,德语,意大利语,西班牙语等。
  • ISO-8859-1使用单字节编码,兼容ASCII编码。
    GB系列字符集
  • GB2312:称为简体中文码表,里面大概含有7000多个简体汉字,此外数学符号,罗马希腊的字母、日本的假名都编进去了,连在ASCII里的原来就与的数字、标点、字母都统统重新用的两个字节编写进去了。
  • GBK:最常用的中文编码。是在原来GB23121码表基础上进行扩展。使用双字节编码。共收录了21000多个汉字,完全兼容GB2312,标准,同时支持繁体汉字以及日韩汉字等。
  • GB18030:最新的中文码表,共收录了7万多个汉字,采用多字节编码,每个字可以由1个字节,2个字节或者4个字节组成,支持国内少数名族的文字,同时支持繁体字以及日韩汉字等。

Unicode字符集:

  • Unicode编码系统为表达任意语言的任意字符而设计的,是业界的一种标准,也成为统一编码,标准万国码表。
  • 它最多使用4个字节的数字来表示每个字母、符号、或者文字,有三种常见的编码方案:UTF-8,UTF-16,UTF-32。
  • UTF-8编码表,用来表示Unicode标准中的任意字符,编码规则:
    1. 128个US-ASCII字符,使用的是一个字节编码
    2. 拉丁字的字母,需要两个字节编码
    3. 大部分常见的汉字,使用的是三个字节编码
    4. 其他极少数的辅助字符,采用的四个字节编码。
编码会引发的问题
  • 由于编码规则不一致,导致引发乱码现象。

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

InputStreamReader类

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

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

代码演示:

  public static void show01() throws IOException{
        //1、创建InuputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
        InputStreamReader is = new InputStreamReader(new FileInputStream("day29_IO\\新建文本文档 .txt"), "GBK");
        //2、使用InputStreamReader对象中的方法read读取文件中的信息
        char[] chars = new char[1024];
        int len = 0;
        while ((len=is.read(chars))!=-1){
            System.out.println(new String(chars,0,len));
        }
        is.close();
    }
  //读取一个使用UTF-8编码的文件
    public static void show02() throws  IOException{
        //1、创建InuputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
        InputStreamReader is = new InputStreamReader(new FileInputStream("day29_IO\\abc.txt"), "utf-8");
        //2、使用InputStreamReader对象中的方法read读取文件中的信息
        char[] chars = new char[1024];
        int len = 0;
        while ((len=is.read(chars))!=-1){
            System.out.println(new String(chars,0,len));
        }
        is.close();
    }
   
OutputStreamWriter类

转换流 java.io.OutputStreamWriter 是Writer的子类,它是字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以手动指定,也可以使用平台默认的字符集。

构造方法
  • public OutputStreamWriter(OutputStream out):创建一个使用平台默认的字符集的字符流。

  • public OutputStreamWriter(OutputStream out,String charsetName):创建一个指定的字符集的字符流。

    代码示例如下:

public static void main(String[] args) throws IOException {
        //1、创建InuputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称(文件路径自己指定)
        InputStreamReader is = new InputStreamReader(new FileInputStream("day29_IO\\新建文本文档.txt"), "GBK");
        //2、创建一个OutputStreamWriter对象,构造方法中传递输出流和指定的字符集(文件路径自己指定)
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\新建文本文档.txt"), "GBK");
        //3、使用InputStreamReader对象中的方法read读取文件中的信息
        char[] chars = new char[1024];
        int len = 0;
        while ((len = is.read(chars)) != -1) {
           //4、使用OutputStreamWriter对象中的方法write方法将InputStreamReader读取到的文件中的信息写出
            osw.write(chars,0,len);
        }
        //5、关闭流
        osw.close();
        is.close();
    }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值