【从零开始学Java | 第三十六篇】字符流

目录

前言

一、字符集(ASCII、GBK、Unicode)

二、Java中编码和解码的方式

1.Java中编码的方法

2.Java中解码的方式

3.案例

三、FileReader

1.空参read方法

2.带参read方法

四、FileWriter

1.构造方法

2.成员方法

3.案例

总结


前言

在上一篇我们学习了字节流,但是字节流在处理纯文本(尤其是包含中文的文本)时,纯粹的字节流很容易引发乱码问题,字符流的出现让我们可以解决中文乱码的问题。

一、字符集(ASCII、GBK、Unicode)

  • ASCII :美国人发明的,只包含英文字母、数字和符号。一个字符占 1 个字节

  • GBK中国人 为了显示汉字发明的标准。在这个标准里,英文占 1 个字节,中文占 2 个字节

    • GBK字符集完全兼容ASCII字符集;

    • 一个英文占一个字节,二进制第一位是0;

    • 一个中文占两个字节,二进制高位的第一个字节是1。

  • Unicode (UTF-8)⭐⭐⭐:万国码,目前互联网最通用的标准。在 UTF-8编码下,英文占 1 个字节,中文占 3 个字节

二、Java中编码和解码的方式

1.Java中编码的方法

String类中的方法 说明
public byte\[\] getBytes() 使用默认方式进行编码
public byte\[\] getBytes(String charsetName) 使用指定方式进行编码

2.Java中解码的方式

| String类中的方法 | 说明 |
| String (byte\[\] bytes) | 使用默认方式进行解码 |

String (byte\[\] bytes, String charsetName) 使用指定方式进行解码

3.案例

java 复制代码
public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //编码
        String str1 = "你好Java";
        byte[] bytes1 = str1.getBytes();
        System.out.println(Arrays.toString(bytes1));

        byte[] bytes2 = str1.getBytes("GBK");
        System.out.println(Arrays.toString(bytes2));

        //解码
        String str2 = new String(bytes1);
        System.out.println(str2);

        String str3 = new String(bytes2);
        System.out.println(str3);
    }
}

运行结果:

第一行使用UTF-8,对应三个字节为一个中文,正数一个字节为一个英文

第二行使用GBK,对应两个字节为一个中文,正数一个字节为一个英文

三、FileReader

为了解决字节流读取文本的痛点,Java 推出了字符流。

核心公式:字符流 = 字节流 + 字符集(编码表)

字符流在底层依然是在搬运字节,但它非常聪明:它会根据指定的默认操作系统的环境编码,通常是 UTF-8,自动判断读取几个字节拼成一个完整的字符。遇到英文读 1 个,遇到中文读 3 个,绝不劈开汉字。

核心流程:

①创建字符输入流对象

构造方法 说明
public FileReader(File file) 创建字符输入流关联本地文件
public FileReader(String pathName) 创建字符输入流关联本地文件

细节:如果文件不存在,则直接报错。

②读取数据

| 成员方法 | 说明 |
| public int read() | 读取数据,读到末尾返回-1 |

public int read(**char\[\]**buffer) 读取多个数据,读到末尾返回-1

③释放资源

1.空参read方法

java 复制代码
public class Test {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("src\\a.txt");

        int ch;
        while((ch = fr.read()) != -1){
            System.out.print((char)ch);
        }
        fr.close();
    }
}

运行结果:

2.带参read方法

注意:要创建char类型的数组。

java 复制代码
public class Test02 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("src\\a.txt");

        char[] chars = new char[2];//一次读取两个字符

        int len;

        while((len = fr.read(chars)) != -1){
            String str = new String(chars, 0, len);
            System.out.print(str);
        }

        fr.close();
    }
}

运行结果:

总结

1、空参read方法,只读取到字符的十进制,需要我们自己来进行一次强制类型转换为char。

2、带参read方法,相当于空参read方法加上强制类型转换。

四、FileWriter

1.构造方法

构造方法 说明
public FileWriter(File file) 创建字符输出流关联本地文件
public FileWriter(String pathName) 创建字符输出流关联本地文件
public FileWriter(File file, boolean append) 创建字符输出流关联本地文件,续写
public FileWriter(String pathName, boolean append) 创建字符输出流关联本地文件,续写

2.成员方法

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

3.案例

java 复制代码
public class FileWriterDemo01 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("src\\b.txt");

        fw.write("Unicode (UTF-8):万国码,目前互联网最通用的标准。\n" +
                "在 UTF-8 编码下,英文占 1 个字节,中文占 3 个字节。");

        fw.close();
    }
}

写入结果:

总结

  • 图片、视频、音频、压缩包 ➡️ 字节流 (FileInputStream / FileOutputStream)

  • Word、Excel ➡️ 字节流 (它们不是纯文本,是富文本格式)

  • TXT、Java 源码、XML、JSON 等纯文本 ➡️ 字符流 (FileReader / FileWriter)

💕❤️😘

相关推荐
方也_arkling7 小时前
【Java-Day08】static / final / 枚举
java·开发语言
橙淮7 小时前
Spring Bean作用域与生命周期全解析
java·spring
风吹夏回7 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei117 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_1128 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding8 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋98 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本8 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
xiaoshuaishuai88 小时前
C# 内存管理与资源泄漏
开发语言·c#
DIY源码阁8 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse