zoukankan      html  css  js  c++  java
  • 43、转换流

    字符编码简介

    计算机中存储的数据都是二进制的数字,我们看到的文字信息是将二进制转换之后显示的,两者之间存在编码与解码的过程,其互相转换必须遵循某种规则,即编码和解码都遵循同一种规则才能将文字信息正常显示,如果编码跟解码使用了不同的规则,就会出现乱码的情况。之前接触过的ASCII编码,这个主要是用来显示英文,除此之外还有别的编码规则常用的有:
    gb2312,gbk,utf-8,big5

    使用字符流读取不同编码的文本

    这里先创建两个文本文档,一个使用utf-8进行编码,文件名命名为utf-8.txt,里面随便写点中文,比如我写了一个"小猴子",另一个使用gbk进行编码,文件名命名为gbk.txt。
    需求:将utf-8.txt中的内容读取并写出到gbk.txt中

    package decode_ecode;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class test_1 {
        public static void main(String[] args) {
            BufferedReader br = null;
            BufferedWriter bw = null;
            try {
                br = new BufferedReader(new FileReader("utf-8.txt"));
                bw = new BufferedWriter(new FileWriter("gbk.txt"));
                String msg = "我爱吃大蒜";
                while((msg = br.readLine()) != null) {
                    bw.write(msg);
                }
                bw.flush();
            }catch(FileNotFoundException e) {
                e.printStackTrace();
            }catch(IOException e) {
                e.printStackTrace();
            }
            
        }
    }

    上面程序出现了乱码问题,因为gbk.txt和utf-8.txt中使用的编码不一致。

    转换流

    如果要解决上面问题,需要使用InputStreamReader和OutputStreamWriter指明文本文件的编码,这两个类都属于字符流,可以将字节流输出为字符流。

    package decode_ecode;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    
    public class test_2 {
        public static void main(String[] args) {
            BufferedReader br = null;
            BufferedWriter bw = null;
            try {
                br = new BufferedReader(new InputStreamReader(new FileInputStream("utf-8.txt"),"utf-8"));
                bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk"));
                String msg = "我爱吃大蒜";
                while((msg = br.readLine()) != null) {
                    bw.write(msg);
                }
                bw.flush();
            }catch(FileNotFoundException e) {
                e.printStackTrace();
            }catch(IOException e) {
                e.printStackTrace();
            }
            
        }
    }

    上面的代码中再FileInputStream对象上使用了InputStreamReader装饰,从而将字节转换为字符,之后再InputStreamReader对象上又使用了BufferedReader将字符进行缓冲,从而提高效率。

  • 相关阅读:
    MySQL 慢日志没有自动创建新的日志文件
    Springboot为什么加载不上application.yml的配置文件
    android studio set proxy
    c++ win32 遍历进程列表
    React Prompt组件 阻止用户离开页面
    JS 浏览器上生成 UUID API
    部署 Nestjs 最佳实践
    Nginx 部署 单页面应用 + nodejs api 应用 最佳实践
    React JS: 如何使用 RxService 管理状态
    umijs 开发优化和生产优化
  • 原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/10143981.html
Copyright © 2011-2022 走看看