【JAVA】编码表,字符流,对象流,其他流(一)

简介: 【JAVA】编码表,字符流,对象流,其他流

1 编码表


1.1 思考:


  • 既然字节流可以操作所有文件,那么为什么还要学习字符流 ?
  • 如果使用字节流 , 把文本文件中的内容读取到内存时, 可能会出现乱码
  • 如果使用字节流 , 把中文写入文本文件中 , 也有可能会出现乱码

1.2 编码表介绍


  • 计算机中储存的信息都是用二进制数据表示的;我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果
  • 按照编码表规则,将字符存储到计算机中,称为编码。
  • 按照同样的编码表规则,将存储在计算机中的二进制数据解析显示出来,称为解码 。
  • 编码和解码使用的码表必须一致,否则会导致乱码。
  • 简单理解:
  • 存储一个字符a,首先需在码表中查到对应的数字是97,然后按照转换成二进制的规则进行存储。称为编码
  • 读取的时候,先把二进制解析出来,再转成97,通过97查找早码表中对应的字符是a。称为解码
  • ASCII码表
  • ASCII(American Standard Code for Information Interchange,美国信息交换标准码表):
  • 包括了数字字符,英文大小写字符和一些常见的标点符号字符。
  • image.png
  • 注意:ASCII码表中是没有中文的。
  • GBK码表:
  • window系统默认的码表。兼容ASCII码表,也包含了21003个汉字,并支持繁体汉字以及部分日韩文字
  • 注意:GBK是中国的码表,一个中文以两个字节的形式存储。但不包含世界上所有国家的文字。
Unicode码表:
  • 由国际组织ISO 制定,是统一的万国码表,计算机科学领域里的一项业界标准,容纳世界上大多数国家的所有常见文字和符号。
  • 但是因为表示的字符太多,所以Unicode码表中的数字不是直接以二进制的形式存储到计算机的,会先通过UTF-7,UTF-7.5,UTF-8,UTF-16,以及 UTF-32的编码方式再存储到计算机,其中最为常见的就是UTF-8。
  • 注意: Unicode是万国码表,以UTF-8编码后一个中文以三个字节的形式存储

1.3 编码表小结


image.png

image.png

1.4 字节流读中文出现码的原码


  • 因为字节流一次读一个字节,而不管GBK还是UTF-8一个中文都是多个字节,用字节流每次只能读其中的一部分,所以就会出现乱码问题

2 字符输出流


2.1 字符流输出介绍


  • Writer类
  • 写入字符流的最顶层的类 , 是一个抽象类 ,不能实例化 , 需要使用其子类FileWriter类
  • FileWriter类 : 用来写入字符文件的便捷类

2.2 FileWriter的成员


  • 构造方法 :
  • public FileWriter(File file) : 往指定的File路径中写入数据
  • public FileWriter(String fileName) : 往指定的String路径中写入数据
  • 成员方法 :
  • image.png
flush() 刷新流,还可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

2.3 FileWriter写数据的步骤


  • 1 创建字符输出流对象
  • 注意事项:
    如果文件不存在,就创建。但是要保证父级路径存在。
    如果文件存在就清空
  • 2 写数据
  • 注意事项:
    写出int类型的整数,实际写出的是整数在码表上对应的字母。
    写出字符串数据,是把字符串本身原样写出。
  • 3 释放资源
  • 注意事项:
    每次使用完流必须要释放资源。
package com.itheima.writer_demo;
import java.io.FileWriter;
import java.io.IOException;
/*
    Writer类 : 写入字符流的最顶层的类 , 是一个抽象类 ,不能实例化
    需要使用其子类FileWriter类
    FileWriter类 : 用来写入字符文件的便捷类
    构造方法 :
        public FileWriter(File file) : 往指定的File路径中写入数据
        public FileWriter(String fileName) : 往指定的String路径中写入数据
    成员方法
        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() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
 */
public class WriterDemo1 {
    public static void main(String[] args) throws IOException {
        // 创建字符输出流对象
        // 如果文件不存在会创建一个空的文件
        // 如果文件存在 , 会把文件中的内容清空
        FileWriter fw = new FileWriter("day12_demo\\charstream2.txt");
        // 写数据
        fw.write('a');
        fw.write('b');
        // 刷新流 , 把流中的数据刷到硬盘中 , 刷新之后可以继续写数据
        // fw.flush();
        // 释放资源
        // 关闭流 , 但是会先刷新流
        fw.close();
        // 一旦关闭流无法写数据
        // fw.write('c');
    }
}
package com.itheima.writer_demo;
import java.io.FileWriter;
import java.io.IOException;
/*
    Writer类 : 写入字符流的最顶层的类 , 是一个抽象类 ,不能实例化
    需要使用其子类FileWriter类
    FileWriter类 : 用来写入字符文件的便捷类
    构造方法 :
        public FileWriter(File file) : 往指定的File路径中写入数据
        public FileWriter(String fileName) : 往指定的String路径中写入数据
    成员方法
        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() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
 */
public class WriterDemo2 {
    public static void main(String[] args) throws IOException {
        // 创建字符输出流对象
        FileWriter fw = new FileWriter("day12_demo\\charstream2.txt");
        // 写数据
//        void write​(int c)  写一个字符
//        fw.write('a');
//        fw.write('b');
//        fw.write('c');
//        void write​(char[] cbuf)  写入一个字符数组
        char[] chs = {'a', 'b', 'c', 'd', 'e'};
//        fw.write(chs);
//        void write​(char[] cbuf, int off, int len)  写入字符数组的一部分
//        fw.write(chs , 2 , 3);
//        void write​(String str) 写一个字符串
//        fw.write("abcadaasda");
//        void write​(String str, int off, int len) 写一个字符串的一部分
//        fw.write("abnacna", 3, 2);
        // 释放资源
        fw.close();
    }
}

2.4 字符输出流练习


package com.itheima.writer_demo;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
/*
    需求 : 将用户键盘录入的用户名和密码保存到本地实现永久化存储。
    要求 : 用户名和密码在文件中各占一行
    步骤:
        1 用户键盘录入用户名
        2 创建字符输出流对象
        3 将用户名和密码写到本地文件中
 */
public class WriterTest {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();
        // 创建字符输出流对象
        FileWriter fw = new FileWriter("day12_demo\\user.txt");
        // 往文件中写入用户名和密码
        fw.write(username);
        // 换行
        fw.write("\r\n");
        fw.write(password);
        // 刷新
        fw.flush();
        // 释放资源
        fw.close();
    }
}

3 字符输入流


3.1 字节输入流介绍


  • Reader类 :
  • 读取字符流的最顶层的类 , 是一个抽象类 ,不能实例化
  • 需要使用其子类FileReader类
  • FileReader类 :
  • 用来读取字符文件的便捷类

3.2 FileReader的成员


  • 构造方法 :
  • public FileReader(File file) : 从指定的File路径中读取数据
  • public FileReader(String fileName) : 从指定的String路径中读取数据
  • 成员方法 :
int read() 一次读一个字符数据
int read(char[] cbuf) 一次读一个字符数组数据
package com.itheima.reader_demo;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/*
    Reader类 : 读取字符流的最顶层的类 , 是一个抽象类 ,不能实例化
    需要使用其子类FileReader类
    FileReader类 : 用来读取字符文件的便捷类
    构造方法 :
        public FileReader(File file) : 从指定的File路径中读取数据
        public FileReader(String fileName) : 从指定的String路径中读取数据
    成员方法 :
        int read​() : 一次读一个字符数据
        int read​(char[] cbuf)   : 一次读一个字符数组数据
 */
public class ReaderDemo1 {
    public static void main(String[] args) throws IOException {
        // 创建字符输入流对象
        FileReader fr = new FileReader("day12_demo\\charstream.txt");
        // 一次读一个字符数据
        int ch;
        while ((ch = fr.read()) != -1) {
            System.out.print((char) ch);
        }
        // 释放资源
        fr.close();
    }
}
package com.itheima.reader_demo;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/*
    Reader类 : 读取字符流的最顶层的类 , 是一个抽象类 ,不能实例化
    需要使用其子类FileReader类
    FileReader类 : 用来读取字符文件的便捷类
    构造方法 :
        public FileReader(File file) : 从指定的File路径中读取数据
        public FileReader(String fileName) : 从指定的String路径中读取数据
    成员方法 :
        int read​() 一次读一个字符数据
        int read​(char[] cbuf)  一次读一个字符数组数据
 */
public class ReaderDemo2 {
    public static void main(String[] args) throws IOException {
        // 创建字符输入流对象
        FileReader fr = new FileReader("day12_demo\\charstream.txt");
        // 一次读一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while ((len = fr.read(chs)) != -1) {
            System.out.println(new String(chs, 0, len));
        }
        // 释放资源
        fr.close();
    }
}
相关文章
|
15天前
|
存储 Java
java用base64编码案例
Java Base64编码示例:导入`java.util.Base64`,设置字符串`originalString`,使用`Base64.getEncoder().encodeToString()`编码并存储到`encodedString`,打印编码后字符串。解码用`Base64.getDecoder().decode()`。
20 0
|
16小时前
|
Java
java一分钟之-字符流与字节流的区别
【5月更文挑战第11天】Java的输入输出通过流操作,分为字符流和字节流。字节流处理二进制数据,如图片、音频,基类是`InputStream`和`OutputStream`;字符流处理文本,基类是`Reader`和`Writer`。字符流涉及编码转换,字节流不涉及。易错点包括乱码(需指定编码)、混用流类型和忘记关闭流。示例展示了字节流和字符流读文件。理解区别并注意编码和资源管理可提高代码质量。
9 3
|
2天前
|
存储 安全 Java
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
|
6天前
|
SQL Java 分布式数据库
实现HBase表和RDB表的转化(附Java源码资源)
该文介绍了如何将数据从RDB转换为HBase表,主要涉及三个来源:RDB Table、Client API和Files。文章重点讲解了RDB到HBase的转换,通过批处理思想,利用RDB接口批量导出数据并转化为`List<Put>`,然后导入HBase。目录结构包括配置文件、RDB接口及实现类、HBase接口及实现类,以及一个通用转换器接口和实现。代码中,`RDBImpl`负责从RDB读取数据并构造`Put`对象,`HBaseImpl`则负责将`Put`写入HBase表。整个过程通过配置文件`transfer.properties`管理HBase和RDB的映射关系。
22 3
实现HBase表和RDB表的转化(附Java源码资源)
|
11天前
|
Java Spring
Java 效率编码 必备插件 Lombok 让代码更优雅
该内容是一个关于Lombok插件的教程摘要:介绍了Lombok用于减少Java开发中的模板代码,提升效率;讲解了如何在IntelliJ IDEA中安装Lombok插件,以及在pom.xml中添加依赖;并提到了@Data注解能自动生成getter/setter、equals、hashCode和toString方法,@Slf4j注解自动处理日志,@Builder用于构建对象,以及@AllArgsConstructor和@NoArgsConstructor注解生成构造函数。还鼓励探索更多Lombok的注解用法。
|
24天前
|
SQL 存储 安全
Java安全编码:防范常见漏洞和攻击
【4月更文挑战第18天】本文介绍了Java安全编码的最佳实践,包括防止SQL注入和XSS攻击,使用预处理语句和转义用户输入。强调了安全的密码存储、角色基础的访问控制以及防止会话劫持和CSRF攻击。此外,还提到数据保护措施,如使用HTTPS和加密敏感数据。最后,建议避免在错误处理中泄露敏感信息并记录审计日志,以提升Java应用的安全性。
|
26天前
|
存储 缓存 Java
【Java IO系列】那字节流和字符流有什么区别?
而如果使用缓存流,一次性从文件里读取多个字节到缓存中,可以减少系统调用同时也减少了磁盘读取,提高了读取的效率。所以字符流是一个很方便的流了,没有必要把一个方便的流转换成一个不方便的流。,涉及到用户空间和内核空间之间的上下文切换,这些切换是很昂贵的。从输入流读取下一个数据字节,值字节以0到255范围内的。好的面试官,Java IO有两个参与对象,一个是。,这个基类提供了3个方法可以来读取字节流。,同样是提供了3个方法来支持字符流读取。好的,有这些不同之处,主要是3个方面。是这样的,虽然字节流比字符流的。
19 1
【Java IO系列】那字节流和字符流有什么区别?
|
29天前
|
Java API
编码的奇迹:Java 21引入有序集合,数据结构再进化
编码的奇迹:Java 21引入有序集合,数据结构再进化
18 0
|
29天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
16 0
|
存储 设计模式 IDE
阿里Java编码手册实战详解-OOP规约
阿里Java编码手册实战详解-OOP规约
106 0