• 转换流


    转换流包括字符编码和字符集

    字符编码和字符集
    字符编码是计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数
    转换之后的结果,按照某种规则,将字符储存到计算机中,称为编码,放置,将存储在计算机中的二进制数按照某种规则
    解析显示出来,称为解码,比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号,反之,按照A规则存储
    ,在按照B规则解析,就会导致乱码现象
    编码:字符->字节
    解码:字节->字符
    字符编码:就是一套自然语言的字符与二进制之间的对应规则
    编码表:生活中文字和计算机中二进制的对应规则
    字符集:也叫编码表,是一个系统支持的所有字符的集合,包裹各国家文字、标点符号、图形符号、数字等
    计算机要准确的储存和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有
    ASCII字符集,GBK字符集,Unicode字符集等

    编码引出的问题
    在一些软件中编码与windows系统的默认编码不是同一编码就会出现乱码问题
    在windows系统中默认的编码是GBK编码,在IDEA中默认使用的是UTF-8编码所以就会出现乱码问题

    解决乱码问题
    就需要用到转换流InputStreamReader与OutStreamWriter,因为
    FileReader只能查询默认码表,如果文件格式与编译器默认的编码不一样,那么就会出现乱码问题


    OutStreamWriter

    /*
    java.io.OutStreamWriter extends Writer
    OutStreamWriter:是字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节,
    继承自父类的共性成员方法:
        void write(int c)写入单个字符
        void write(char[] chuf)写入字符数组
        abstract void write(char[] chuf,int off,int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数
        void write(String str)写入字符串
        void write(String str, int off, int len)写入字符串的某一部分,off字符串的开始索引,len写的字符个数
        void flush()刷新该流的模块
        void close()关闭此流,但要先刷新
    
        构造方法:
            OutStreamWriter(OutputStream out)  创建使用默认字符编码的 OutStreamWriter
            OutStreamWriter(OutputStream out, String charsetName)      创建使用指定字符集的 OutStreamWriter
            参数:
                OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
                String charsetName:指定的编码表名称,不区分大小写
        使用步骤:
            创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
            使用OutputStreamWriter对象中的方法Write,把字符转换为字节存储到缓冲区中
            使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中
            资源释放 */
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    
    
    public class OutputStreamWrite {
        public static void main(String[] args) throws IOException{
            write_utf_8();
        }
    
        /* 使用转换流写utf-8格式的文件 */
        private static void write_utf_8() throws IOException{
                OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("1.txt"),"utf-8");
                osw.write("你好");
                osw.flush();
                osw.close();
        }
    }

     InputStreamRead

    /*
    InputStreamReader
    java.io.InputStreamReader extends Reader
    InputStreamReader 是字节流通向字符流的桥梁,他使用指定的charset读取字节并将其编码为字符
    继承自父类的共性方法:
        int read()读取单个字节并返回
        int read(char[] chuf)一次读取多个字符,将字符读入数组
        void close() 关闭该流并释放与之相关的所有资源
    构造方法
        InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader
        InputStreamReader(InputStream in,String charsetName) 创建使用指定字符集的 InputStreamReader
        参数:
            InputStream in: 字节输入流,用来读取文件中保存的字节
            String charsetName:指定的编码表名称,不区分大小写
        使用步骤
            创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
            使用InputStreamReader对象中的方法read读取文件
            释放资源
        注意事项
            构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码
    */
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class DemoInputStreamRead {
        public static void main(String[] args) throws IOException{
            read_utf_8();
        }
    private static void read_utf_8() throws IOException{
        InputStreamReader isr = new InputStreamReader(new FileInputStream("1.txt"),"utf-8");
        int len = 0;
        while((len = isr.read())!=-1){
            System.out.println((char)len);
        }
        isr.close();
    }
    
    }
  • 相关阅读:
    Java自学笔记(21):【IO】数据流,标准输入输出
    makefile 学习笔记
    tensorflow 环境搭建
    matlab
    【转】MATLAB各种矩阵生成函数
    leetcode刷题收获
    leetcode 15. 3Sum
    STL 记录
    leetcode 服务器环境
    visual studio 2017 使用笔记
  • 原文地址:https://www.cnblogs.com/zhao-yang/p/14223766.html
Copyright © 2020-2023  润新知