Java入门 第十三节(二)IO流转换流

1. 什么时候使用转换流

  1. 什么是转换流?
    • 转换流,相当于字符和字节流之间的 “桥梁”
  2. 数据源是字节流,或者底层框架返回的字节流数据,但是操作的数据是,纯文本数据,可以使用转换流。
  3. 操作纯文本需要具体的编码指定时,字节流字符流处理不了编码问题,只有转换流是为了解决字符流编码问题。

2. 方法介绍

  1. 主要进行编码的转换,用来解决字符流读写乱码的问题。
    • String charsetName 是指定字符集(即编码)。
	1.OutputStreamWriter: 写出:
		1.1 OutputStreamWriter(OutputStream out,String charsetName);  
		1.2 OutputStreamWriter(OutputStream out);
	2.InputStreamReader: 读取:
		2.1 InputStreamReader(InputStream in)
		2.2 InputStreamReader(InputStream in,String charsetName);

2.1 将控制台输入写入文件中

  1. 键盘输入信息,保存到磁盘中。
    • 键盘输入的是 System.in 字节流。
    • 遇到指定的字符停止输入。
public static void main(String[] args) throws IOException {
        //1.控制台输入的是 字节流 System.in
        //  字节流-->字符流 , 当输入ok时,停止下来。
        try( BufferedReader br =
                     new BufferedReader(new InputStreamReader(System.in));
             BufferedWriter bw =
                     new BufferedWriter(new FileWriter("D://a.txt"));){
            String line;
            while((line=br.readLine())!=null){
                //判断
                if ("ok".equals(line)){
                    break;//跳出
                }
                bw.write(line);
                bw.newLine();//换行
                bw.flush();//刷新
            }
        }
    }

2.2 将文件中内容显示到控制台

  1. 将文件中的内容显示到控制台上。
    • 键盘输入的是 System.in 字节流。
public static void main(String[] args) throws IOException {
        //将读取的字符流转换为字节流输出到控制台   字符流-->字节流
        try( BufferedReader br = new BufferedReader(new FileReader("D://a.txt"));
             BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))){

            String line;
            while((line=br.readLine())!=null){
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
        }
    }

3. 常见编码表

  1. 编码表最主要的作用,就是随着计算机不断的发展,解决各个国家因字符集不同而出现的乱码问题。
    • 如: io读写。
编码说明编码范围字节量
ASC-II英文,标点,基本指令0到127单字节
ISO-8859-1ASC-II扩展,西欧字符128~255单字节
ANSIANSI是一种字符编码规范,设计为了使计算机支持更多语言,英文用单字节编码,其他字符用双字节编码CJK表示亚洲字符编码的统称(中日韩)
GBK中国国标码最大65535英文使用单字节,中文使用双字节
UNICODE统一码Java的char类型字符 就采用Unicode编码100万+编码位,分为常用字符表,生僻字符表等,我们只是用常用表常用字符表所有字符都采用双字节
UTF-8Unicode传输格式Unicode Transformations Format为了解决Unicode英文字符字节量翻倍的问题,提出的一种变长的编码格式UTF是unicode传输格式英文单字节,某些字符双字节,中文三字节,一些特殊符号四字节

3.1 编码字节测试

  1. 测试编码占字节。
    • 注意,getBytes()需要抛异常。
public static void main(String[] args) throws UnsupportedEncodingException {
        String s= "你好8";
        //编码占字符大小
        System.out.println(s.getBytes().length);//获取默认编码
        System.out.println(s.getBytes("UTF-8").length); //数字1个,汉字占3个
        System.out.println(s.getBytes("GBK").length);//数字1个 汉字 2个
        System.out.println(s.getBytes("unicode").length);//双字节,一个汉字3个,字符2个
        System.out.println(s.getBytes("iso-8859-1").length);//单字节,占1个。
    }

4. 指定编码读取

4.1 转换流–读

  1. 当需要指定编码读取的时候就需要转换流 。
  2. 如果你设置与打开一致则不需要。
    • 乱码通常是汉字乱码, 字母和数字不会乱码,因为早期编码集都将字母与数字收录在其中。
  3. 一定要注意:同编码,同解码。
    • 即:数据源如果是UTF-8,就需要使用UTF-8去读。
/**
	创建一个a.txt 
		内容: 你好java
			编码格式 UTF-8 
	a就相当于源文件。
*/
 public static void main(String[] args) {

        File file = new File("D://a.txt");//例如:a.txt编码格式为UTF-8编码
        try {
            method1(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 测试读
     * @param file
     */
    private static void method1(File file) throws IOException {

        // 读取文件使用的是 Gbk编码读取
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file),"GBK"));

        String line;
        while((line=br.readLine())!=null){
            System.out.println(line); //会乱码 ---浣犲ソjava
        }

    }

4.2 转换流–写

  1. 往文件中写入数据。
    • 要求,不同编码。
  2. 字节流处理不了编码问题,转换流是为了解决字符流编码问题。
    • 相当于: 字节流 = 字符流+编码集。
  public static void main(String[] args) {

        File file = new File("D://a.txt");//例如:a.txt编码格式为UTF-8编码
        try {
            method2(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 测试写
     * @param file
		
     */
    private static void method2(File file) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"ISO-8859-1"));
        bw.write("你好,中国");
        bw.write("123");
        bw.write("io");
        bw.close();
    }
    
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吴琼老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值