字符集及其编码、解码操作、IO流分类

字符集

1、ASCII字符集:一个字节(8位)存储一个字符(大小写字母,数字或特殊符号)

2、ASCII字符集中一个字节八位实际有效的只有后七位,第一位都是0

3、GBK字符集(汉字内码扩展规范,国标)包括了ASCII,两个字节存储一个汉字字符

4、GBK规定:汉字的第一个字节的第一位必须是1,与ASCII第一位必须是0区分开来,用于在一句话中区分ASCII(一个字节)和GBK(两个字节)

5、Unicode字符集(统一码,也叫万国码),UTF-32字符集每四个字节表示一个字符,虽然容纳的多,但是占空间多,通信效率变低

6、UTF-8字符集是Unicode字符集的一种编码方案,长度区分1个字节、2个字节、3个字节、4个字节。技术

要点回顾

字符编码和解码时使用的字符集必须一样,否则会出现乱码,

字符集的编码、解码操作

java 复制代码
package com.itheima.demo3character;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Arrays;

public class CharSetDemo1 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //目标:写程序实现字符编码和解码
        //1、编码(成字节形式,再转化成十进制)
        String name = "本尊!!!";
        byte[] bytes = name.getBytes("GBK");//指定GBK进行编码
        System.out.println(bytes.length);//7
        System.out.println(Arrays.toString(bytes));//[-79, -66, -41, -16, 33, 33, 33]

        //2、解码(成我能看懂的)
        //String name2 = new String(bytes);//编码与解码不一致,会乱码
        String name3 = new String(bytes, "GBK");//指定GBK进行解码
        //System.out.println(name2);//����!!!
        System.out.println(name3);//本尊!!!
    }
}

IO流

I指Input,称为输入流:富足把数据读到内存中去

O指Ouput,称为输出流:负责写数据出去

IO流的分类

IO流的体系:字节输入流、字节输出流、字符输入流、字符输出流

小结

IO流-文件字节输入流

1、字节输入流InputStream、字节输出流OutputStream、字符输入流Reader、字符输出流Writer都是抽象类

2、FileInputStream、FileOutputStream、FileReader、FileWriter是对应以上的实现类

3、文件字节输入流FileInputStream的作用是把磁盘文件中的数据以字节的形式读入到内存中去

java 复制代码
package com.itheima.demo4fileinputstream;

import java.io.*;

public class FileInputDemo1 {
    public static void main(String[] args) throws IOException {
        //目标:掌握文件字节输入流读取文件中的字节数组到内存中来
        //1、创建文件字节对象  输入流管道于源文件接通
        InputStream is = new FileInputStream(new File("day03-file-io\\src\\lll02"));
        //2、创建文件字节路径  输入流管道与源文件接通
        //InputStream is2 = new FileInputStream("day03-file-io\\src\\lll02");//两个是一样的,简化写法
        InputStream is2 = new FileInputStream("day03-file-io\\src\\lll03");

        //3、读取文件中的字节并输出
        //定义一个变量记住每次读取的一个字节
        int b;
        while ((b = is.read()) != -1)//按顺序判断内容对应的ASCII字符是否等于-1
        {
            System.out.print((char) b);
        }
        //每次读取一个字节的问题,性能较差,读取汉字输出一定会乱码


        //4、读取文件中的字节数组并输出,每次读取多个字节
        //定义一个字节数组,每次读取多个字节
        byte[] bytes = new byte[3];
        //定义一个变量记住每次读取多少个字节,读取多少倒多少
        int len;
        while ((len = is2.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, len));//abc
                                                                //666
                                                                //g
        }
    }
}
java 复制代码
//一次性读完文件的全部字节,避免读取汉字输出乱码的问题,缺点:内存过大时不适合使用
        byte[] bytes1 = is.readAllBytes();
        String s = new String(bytes1);
        System.out.println(s);

小结

1、文件字节输入流,读取文件数据的步骤?

创建文件字节路径 输入流管道与源文件接通 / 创建文件字节对象 输入流管道于源文件接通

2、如何使用字节输入流读取中文内容输出时不乱码呢?

一次性读完文件的全部字节,避免读取汉字输出乱码的问题,但缺点:内存过大时不适合使用

相关推荐
wechat_Neal18 小时前
Golang的车载应用场景
开发语言·后端·golang
一叶飘零_sweeeet19 小时前
深入拆解 Java CAS:从底层原理到 ABA 问题实战
java·cas·并发编程
StackNoOverflow19 小时前
Spring Security权限控制框架详解
java·数据库·sql
yaaakaaang19 小时前
九、装饰器模式
java·装饰器模式
weixin_5134499619 小时前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习
d_dreamer19 小时前
SeaTunnel推荐Maven版本
java·maven
飞Link19 小时前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化
曾阿伦19 小时前
Python3 文件 (夹) 操作备忘录
开发语言·python
清心歌19 小时前
记一次系统环境变量更改后在IDEA中无法读取新值的排查过程
java·后端·intellij-idea·idea
大尚来也19 小时前
驾驭并发:.NET多线程编程的挑战与破局之道
java·前端·算法