转换流(笔记)

一.编码表

**就是生活中的文字和计算机中文字的对应关系表**

a-->97-->01100001==>存储到计算机中

中-->20013-->0010000000001011==>存储到计算机中

**编码:把能看懂的文字,转换为看不懂的文字(字符==>字节)**

**解码:把看不懂的文字,转换为能看懂的文字(字节==>字符)**

常用的编码表:

**ASCII字符集** (美国信息交换标准代码):英文,数字,标点符号和计算机中文字的对应关系

​	'0'-->48	'A'-->65	'a'-->97

**ISO-8859-1字符集**:拉丁码表

- 拉丁码表,别名Latin-1,用于显示欧洲使用的语言,包括荷兰、丹麦、德语、意大利语、西班牙语等。
- ISO-8859-1使用单字节编码,兼容ASCII编码。**不支持中文**

**GBxxx字符集**:国标

- GB就是国标的意思,是为了显示中文而设计的一套字符集。兼容ASCII表
- GB2312:简体中文码表。 7000多个简体汉字 
- **GBK**:**目前操作系统默认中文码表(简体,繁体),存储一个中文使用2个字节**,21003个汉字 
- GB18030:最新的中文码表。包含的文字最全(简体,繁体,少数民族,日韩文字)

**Unicode字符集** :万国码

- **UTF-8**:最常用的万国表,兼容所有国家的文字
- 编码规则:
  - 128个US-ASCII字符,只需一个字节编码。
  - 拉丁文等字符,需要二个字节编码。 
  - **大部分常用字(含中文),使用三个字节编码。**
  - 其他极少使用的Unicode辅助字符,使用四字节编码。

二. 编码引出的问题

使用FileReader读取GBK编码的文件:会出现乱码,编码和解码不一致导致
在这里插入图片描述

package com.itheima.demo06reverseStream;

import java.io.FileReader;
import java.io.IOException;

/*
    使用FileReader读取GBK编码的文件:会出现乱码,编码和解码不一致导致
    GBK编码:一个中文占用2个字节
    UTF-8编码:一个中文占用3个字节
    FileReader流对象只能读取IDEA默认编码UTF-8编码的文件
 */
public class Demo01FileReader {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("day11\\gbk.txt");
        int len = 0;
        while ((len=fr.read())!=-1){
            System.out.print((char)len);//��� 乱码
        }
        fr.close();
    }
}

三.转换流的原理(扩展)

在这里插入图片描述

四.InputStreamReader:字符转换输入流(重点)

/*
java.io.InputStreamReader:字符转换输入流 extends Reader:字符输入流
作用:
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
解码:字节==>字符
有继承自父类的共性成员方法:
int read() 读取单个字符。
int read(char[] cbuf) 将字符读入数组。
void close() 关闭该流并释放与之关联的所有资源。
构造方法:
InputStreamReader(InputStream in)创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。
参数:
InputStream in:传递字节输入流,可以传递InputStream的任意的子类对象
String charsetName:传递编码表名称,不区分大小写,可以传递GBK|gbk,UTF-8|utf-8…
不写编码表名称,在IDEA中默认使用UTF-8编码
----------------------------------------------------------------------------------------------
1.创建InputStreamReader对象,构造方法中传递FileInputStream对象和指定的编码表名称
2.使用InputStreamReader对象中的方法read,读取文件
3.释放资源
注意:
指定的编码表名称和要读取的文件的编码必须一致,否则会出现乱码
*/

在这里插入图片描述

package com.itheima.demo06reverseStream;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/*
    InputStreamReader:字符转换输入流
    作用: 解码 字节==>查询指定编码表==>字符
    使用步骤:
        1.创建InputStreamReader对象,构造方法中传递FileInputStream对象和指定的编码表名称
        2.使用InputStreamReader对象中的方法read,以指定的编码读取文件
        3.释放资源
    注意:
        构造方法中指定的编码表名称和文件的编码必须相同,否则出现乱码
 */
public class Demo02InputStreamReader {
    public static void main(String[] args) throws IOException {
        //read_GBK();
        read_UTF8();
    }

    /*
        使用InputStreamReader读取UTF-8编码的文件
     */
    private static void read_UTF8() throws IOException {
        //1.创建InputStreamReader对象,构造方法中传递FileInputStream对象和指定的编码表名称
        //InputStreamReader isr = new InputStreamReader(new FileInputStream("day11\\utf-8.txt"),"GBK");//浣犲ソ
        InputStreamReader isr = new InputStreamReader(new FileInputStream("day11\\utf-8.txt"),"utf-8");//你好
        //2.使用InputStreamReader对象中的方法read,以指定的编码读取文件
        int len = 0;
        while ((len=isr.read())!=-1){
            System.out.print((char)len);
        }
        //3.释放资源
        isr.close();
    }

    /*
        使用InputStreamReader读取GBK编码的文件
     */
    private static void read_GBK() throws IOException {
        //1.创建InputStreamReader对象,构造方法中传递FileInputStream对象和指定的编码表名称
        InputStreamReader isr = new InputStreamReader(new FileInputStream("day11\\gbk.txt"),"GBK");
        //2.使用InputStreamReader对象中的方法read,以指定的编码读取文件
        int len = 0;
        while ((len=isr.read())!=-1){
            System.out.print((char)len);
        }
        //3.释放资源
        isr.close();
    }
}

五.OutputStreamWriter:字符转换输出流(重点)

/*
java.io.OutputStreamWriter:字符转换输出流 extends Writer:字符输出流
作用:
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。
编码:字符==>字节
继承自父类的共性成员方法:
public abstract void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public abstract void flush() :刷新此输出流并强制任何缓冲的输出字符被写出。
public void write(int c) :写出一个字符。
public void write(char[] cbuf) :将 b.length字符从指定的字符数组写出此输出流。
public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。
public void write(String str) :写出一个字符串
public void write(String str, int off, int len) 写入字符串的某一部分。
构造方法:
OutputStreamWriter(OutputStream out)创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。
参数:
OutputStream out:传递字节输出流,可以传递OutputStream的任意的子类对象
String charsetName:传递编码表名称,不区分大小写,可以传递GBK|gbk,UTF-8|utf-8…
不写编码表名称,在IDEA中默认使用UTF-8编码


使用步骤:
1.创建OutputStreamWriter对象,构造方法中传递FileOutputStream对象和指定的编码表名称
2.使用OutputStreamWriter对象中的方法write,把数据写入到内存缓冲区中(编码:字符==>字节)
3.使用OutputStreamWriter对象中方法flush,把内存缓冲区中的数据刷新到文件中(FileOutputStream写字节)
4.释放资源(会先调用flush方法刷新数据)
*/
在这里插入图片描述

package com.itheima.demo06reverseStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/*
    OutputStreamWriter:字符转换输出流
    作用: 编码 字符==>查询编码表==>字节
    使用步骤:
        1.创建OutputStreamWriter对象,构造方法中传递FileOutputStream对象和指定的编码表名称
        2.使用OutputStreamWriter对象中的方法write,把数据写入到内存缓冲区中(编码:字符==>字节)
        3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的数据刷新到文件中(fos写字节到文件中)
        4.释放资源(会先调用flush刷新文件)
 */
public class Demo03OutputStreamWriter {
    public static void main(String[] args) throws IOException {
        //write_GBK();
        write_UTF8();
    }

    /*
        使用OutputStreamWriter写UTF-8编码的文件
     */
    private static void write_UTF8() throws IOException {
        //1.创建OutputStreamWriter对象,构造方法中传递FileOutputStream对象和指定的编码表名称
        //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day11\\utf-82.txt"),"UTF-8");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day11\\utf-83.txt"));//不写编码表默认IDEA编码UTF-8
        //2.使用OutputStreamWriter对象中的方法write,把数据写入到内存缓冲区中
        osw.write("你好");
        //3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的数据刷新到文件中
        osw.flush();
        //4.释放资源(会先调用flush刷新文件)
        osw.close();
    }

    /*
        使用OutputStreamWriter写GBK编码的文件
     */
    private static void write_GBK() throws IOException {
        //1.创建OutputStreamWriter对象,构造方法中传递FileOutputStream对象和指定的编码表名称
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day11\\gbk2.txt"),"gbk");
        //2.使用OutputStreamWriter对象中的方法write,把数据写入到内存缓冲区中
        osw.write("你好");
        //3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的数据刷新到文件中
        osw.flush();
        //4.释放资源(会先调用flush刷新文件)
        osw.close();
    }
}

总结:
什么时候使用FileReader和FileWriter(读写字符的便捷类):读写的文件都是IDEA默认编码utf-8的文件
什么时候使用InputStreamReader和OutputStreamWriter:读写的文件不是IDEA默认编码utf-8的文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旭子在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值