• 字符流,编码表,字符流写数据,字符流读数据


    前言

    因为近期考试原因,还有自身惰性的问题,小编最近停更了一段时间,随之而来的罪恶感让我又开启了自学与创作之路,学习这么久,自己虽然发布了许多博客,但是大部分都是看着笔记写的,导致学的不是很扎实,所以希望自己在以后的博客中能更多的融入自己的一些想法,能将所学知识灵活运用!

    字符流

    今天主要学习的是字符流和字符缓冲流,上次我们说过,字节流可以操作所有文件,所以为什么还要学习字符流呢?原因有以下几点:

    1.如果利用字节流,把文本文件中的中文,读取到内存中,有可能出现乱码。
    2.如果利用字节流,把中文写到文本文件中,也有可能出现乱码。
    
    • 1
    • 2

    我们要理解这个过程,首先要知道编码表

    编码表

    有以下基础知识首先要知道:

    1.计算机中存储的信息都是用二进制数表示的。
    2.按照某种规则,将字符变成二进制,再存储到计算机中,称为编码。
    3.编码和解码的方式必须一致,否则会导致乱码。
    
    • 1
    • 2
    • 3

    简单理解一下,也就是说,存储一个字符 a,首先需要在码表中查到对应的数字是97,然后转换成二进制进行存储.读取的时候,先把二进制解析出来,再转换成97,通过97查找到对应的字符串a,这也就是编码和解码的过程。
    上述我们所提到的码表也就是编码表包括:

    1.ASCII字符集:
      ASCII:包括了数字,大小写字符和一些常见的标点符号
      注意:ASCII码表中是没有中文的。
      
    2.GBK:window系统默认的码表。兼容ASCII码表,也包括了21033个汉字,并支持
      繁体字以及部分日韩文字。
      注意:GBK是中国的码表,一个中文以两个字节的形式存储。但不包括世界上所有
      国家的汉字。
      
      3.Unicode码表:
      	由国际组织ISO制定,是统一的万国码,计算机科学领域里的一项业界标准,容
      	纳世界上大多数国家的所有常见文字和符号。但是因为表示的字符太多了,所
      	以Unicode码表中得出数字不是直接以二进制的形式存储到计算机的。
      	会先通过 UTF-7,UTF-7.5,UTF-8,UTF-16,以及UTF-32进行编码,再存储到计
      	算机。所以我们经常说的UTF-8不是编码表,而是一种编码方式。
      	注意:Unicode是万国码,以UTF-8编码后的一个中文以三个字节的形式存储。	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里,我们需要记住两个重点

    	1.windows默认使用码表为GBK,一个字符两个字节。
    	2.idea和以后工作默认使用Unicode的 UTF-8编解码格式,一个中文三个字节。
    
    • 1
    • 2

    字符串中的编码解码问题

    方法名说明
    byte[] getBytes()使用平台的默认字符集将该String编码为一系列字节
    byte[] getBytes(String charsetName)使用指定的字符集将该 String 编码为一系列字节
    String (bytes[] bytes)使用平台的默认字符集解码指定的字节数组来创建字符串
    String(byte[]bytes,String charset Name)通过指定的字符集解码指定的字节数组来创建字符串

    注意:这四个方法都是String 类中的方法。

    • 代码演示:
    package com.hcx;
    
    import java.io.UnsupportedEncodingException;
    import java.util.Arrays;
    
    public class Demo1 {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String s = "中国";
            byte[] bytes1 = s.getBytes();//以系统默认的编码进行编码
            byte[] bytes2 = s.getBytes("utf-8");//以utf-8的编码方式进行编码
            byte[] bytes3 = s.getBytes("gbk");//以gbk的编码方式进行编码
            System.out.println(Arrays.toString(bytes1));
            System.out.println(Arrays.toString(bytes2));
            System.out.println(Arrays.toString(bytes3));
            System.out.println("==================");
    
            String s1 = new String(bytes1);//以系统默认的方式进行解码
            String s2 = new String(bytes1, "utf-8");//以utf-8的字符集进行解码
            String s3 = new String(bytes1, "gbk");//以gbk字符集的方式进行解码
            System.out.println(s1);
            System.out.println(s2);
            System.out.println(s3);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 控制台输出:
      在这里插入图片描述
      如上,我们也可以看出,IDEA默认编码和解码方式为 UTF-8,并且以UTF-8编码后一个中文用三个字节存储,以GBK编码后一个中文用两个字节存储

    字符流写数据

    字符流写数据,有两种形式:

    	writer:用于写入字符流的抽象父类
    	FileWriter:用于写入字符流的抽象子类
    
    • 1
    • 2

    一般常用FileWriter
    我们下面来介绍它的构造方法

    方法名说明
    FileWriter(File file)根据给定的 File 对象构造一个 FileWriter 对象
    FileWriter(File file, boolean append)根据给定的 File 对象构造一个 FileWriter 对象
    FileWriter(String fileName)根据给定的文件名构造一个 FileWriter 对象
    FileWriter(String fileName,boolean append)根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象

    接下来是它的成员方法

    方法名说明
    void write(int c)写一个字符
    void write(char[] cbuf)写入一个字符组
    void write(char[] cbuf,int off,int len)写入字符数组的一部分
    void write(String str)写一个字符串
    void write(String str,int off, int len)写一个字符串的一部分

    还有刷新关闭方法

    方法名说明
    flush()刷新流,之后还可以继续写数据
    close()关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
    • 代码演示:
    package com.hcx;
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class Demo2 {
        public static void main(String[] args) throws IOException {
            FileWriter fileWriter = new FileWriter("a.txt");
            fileWriter.write(97);//写一个字符
            fileWriter.write(98);
            fileWriter.write(99);
            fileWriter.write("\r\n");
    
            char[] chs={'a','b','c','d','e'};//写入一个字符数组
            fileWriter.write(chs);
            fileWriter.write("\r\n");
    
            fileWriter.write(chs,0,3);//写入字符数组的一部分
            fileWriter.write("\r\n");
    
            fileWriter.write("abcde");//写入一个字符串
            fileWriter.write("\r\n");
    
            fileWriter.write("abcde",0,3);//写入字符串的一部分
            fileWriter.close();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 当前模块写 a.txt文件内容:

    在这里插入图片描述

    字符流读数据

    字符流读数据也有两种形式

    	Reader:用于读取字符流的抽象父类
    	FileReader:用于读取字符流的常用子类
    
    • 1
    • 2

    一般用FileWriter
    我们接下来介绍它的构造方法

    方法名说明
    FileReader(File file)在给定从中读取数据的 File 的情况下创建一个新 FileReader
    FileReader(String fileName)在给定从中读取数据的文件名的情况下创建一个新 FileReader

    接下来是它的成员方法

    方法名说明
    int read()一次读一个字符数据
    int read(char[] cbuf)一次读一个字符数组数据
    • 代码演示:
    package com.hcx;
    
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class Demo3 {
        public static void main(String[] args) throws IOException {
            FileReader fileReader = new FileReader("a.txt");
    
            //一次读取一个数据
            int ch;
            while((ch=fileReader.read())!=-1){
                System.out.print((char)ch);
            }
    
             //一次读取一个字符数组数据
    
            char[] chars = new char[1024];
            int len;
            while((len = fileReader.read(chars))!= -1){
                System.out.print(new String(chars,0,len));
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    总结

    	本篇文章介绍了为什么要使用字符流,然后介绍了几种编码表,字符串中的编码
    	和解码过程以及问题(中文乱码)以及字符流的使用,字符流写数据、字符流读
    	数据,希望大家多多支持,你们的支持,是我前进的动力!		
    
    • 1
    • 2
    • 3
  • 相关阅读:
    一个实际工作中的sql的模拟
    谁在领跑纯电动L2
    Windows10启用WSL2,安装子系统Ubuntu20.04.4 LTS并在Ubuntu中部署docker
    axios 拦截器实现原理
    在以「基础设施」为定位的发展阶段里,产业变成了一个可以有诸多创新的存在
    基于Java实现的贪吃蛇大作战小游戏
    DDIM代码详细解读(2):关键参数计算、损失函数设计、添加时间步长信息、归一化设计
    【软件设计师-从小白到大牛】上午题基础篇:第七章 程序设计语言与语言处理程序基础
    【elasticsearch】搜索过程详解
    JSP之自定义jstl标签
  • 原文地址:https://blog.csdn.net/hihielite/article/details/127863797