IO的进阶

ops/2024/12/19 18:53:46/

目录

  • 1. 字符流转向字节流的桥梁
    • 1.1 OutputStreamWriter
    • 1.2 InputStreamReader
    • 1.3 编码与解码
    • 1.4 常见编码方式
    • 1.5 编码与解码的注意事项
  • 2.Properties
    • 2.1概述
    • 2.2 Properties 的常用方法
    • 2.3 Properties 的应用场景
    • 2.4 实例
  • 3.序列化
    • 3.1 ObjectOutputStream
  • 4.字符编码
    • 4.1 ASCII
    • 4.2 GBK
    • 4.3 UTF-8
    • 4.4 编码与解码的注意事项

1. 字符流转向字节流的桥梁

Ascii中GBK码表

在这里插入图片描述

UTF-8 码表

在这里插入图片描述

在Java中,字符流和字节流之间需要进行转换,以便在不同的场合使用。OutputStreamWriter 和 InputStreamReader 分别用于将字符流转换为字节流,以及将字节流转换为字符流。

1.1 OutputStreamWriter

OutputStreamWriter 将字符流转换为字节流。其构造方法可以指定字符编码,例如 GBK 或 UTF-8,以支持不同语言字符的写入。

1.2 InputStreamReader

InputStreamReader 将字节流转换为字符流。其构造方法可以指定字符编码,以便正确解析不同语言字符的读取。

1.3 编码与解码

在计算机中,字符信息实际上是存储为二进制数据的。不同的编码方式会将字符映射到不同的二进制数值。例如,ASCII码将英文字符映射到0-127的数值,而GBK码则支持中文字符,并使用更宽的范围的数值。

1.4 常见编码方式

ASCII:美国信息交换标准码,主要用于英文字符。
GBK:国家标准GB 2312,支持简体中文。
UTF-8:Unicode Transformation Format 8,支持几乎所有语言字符,是目前最常用的编码方式。

1.5 编码与解码的注意事项

编码和解码必须使用相同的编码方式。例如,如果使用 GBK 编码写入文件,就必须使用 GBK 解码读取文件,否则会出现乱码。
UTF-8 编码可以兼容 ASCII 码,因此,对于纯英文文本,使用 UTF-8 编码是最佳选择。

public class ConverterDemo {public static void main(String[] args) {//创建字符流转换字节流的桥梁的对象OutputStreamWriter ow = null;try {//ow = new OutputStreamWriter(new FileOutputStream("b.txt"));//字符流通向字节流的桥梁可以指定存储的编码ow = new OutputStreamWriter(new FileOutputStream("b.txt"),"GBK");ow.write("中");ow.flush();} catch (Exception e) {e.printStackTrace();}finally {try {if(ow != null){ow.close();}} catch (IOException e) {e.printStackTrace();}}}
}

2.Properties

2.1概述

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

特点:

1.继承于Hashtable,是线程安全的键值对存储结构

  1. Properties 可保存在流中或从流中加载
  2. 只能保存字符串的键值对。

2.2 Properties 的常用方法

  • load(InputStream inStream):从输入流中加载属性列表。
  • store(OutputStream outStream, String comments):将属性列表保存到输出流中,可以添加注释。
  • setProperty(String key, String value):设置属性值。
  • getProperty(String key):获取属性值。

2.3 Properties 的应用场景

  • 配置文件:用于存储应用程序的配置信息,例如数据库连接参数、用户设置等。
  • 国际化:用于存储不同语言的文本内容,例如界面提示信息、错误消息等。

2.4 实例

public class PropTest6 {public static void main(String[] args) {//创建一个Properties对象Properties prop = new Properties();InputStream in = null;try {//in = new FileReader("src/names.properties");                  in=PropTest6.class.getClassLoader().getResourceAsStream("names.properties");//从字节流中来加载数据到属性对象中prop.load(in);System.out.println(prop);} catch (Exception e) {e.printStackTrace();} finally {if(in != null){try {in.close();} catch (IOException e) {e.printStackTrace();}}}}
}

3.序列化

序列化流:

​ 对象输出流:ObjectOutputStream 将Java对象写入输出流中。要进行序列化的对象必须实现 Serializable 接口。

​ 对象输入流:ObjectInputStream 从输入流中读取Java对象。读取对象时,需要保证对象类与序列化时使用的类相同,并且具有相同的序列化版本号(serialVersionUID),ObjectInputStream 对以前使用 ObjectOutputStream 写入的对象进行反序列化。

3.1 ObjectOutputStream

我们要序列化的对象需要实现序列化接口

在这里插入图片描述

实现

在这里插入图片描述

我们一般会提供一个serialVersionUID

某个类序列化之后,如果类发生了 ,那么依然可以反序列化。

如果要是对多个对象来做序列化,一定要放在集合中。

4.字符编码

字符编码是将字符转换为二进制数值的过程,而解码则是将二进制数值转换回字符的过程。

存储:在计算机中存储字符都是存储的字符所对应的数值以二进制的形式表示。

展示:去相关的编码表中去查找该值(存储的值)所对应的字符。

4.1 ASCII

ASCII码是最早的字符编码标准,它使用7位二进制数表示128个字符,包括英文字母、数字、标点符号等。

在这里插入图片描述

4.2 GBK

GBK码用于存储中文的码表,是针对简体中文的编码标准,它使用双字节表示一个汉字,并可以兼容 ASCII码。

在这里插入图片描述

4.3 UTF-8

UTF-8编码最大的一张码表包含了所有的字符标准,UTF-8编码是一种可变长度的编码方式,它可以表示几乎所有语言的字符。UTF-8编码使用1-4个字节表示一个字符,英文字符使用1个字节,中文字符使用3个字节。

在这里插入图片描述

4.4 编码与解码的注意事项

编码和解码必须使用相同的编码方式。
UTF-8 编码可以兼容 ASCII 码。
选择合适的编码方式可以提高效率。


http://www.ppmy.cn/ops/143258.html

相关文章

《网络对抗技术》Exp9 Web安全基础

实验目标 理解常用网络攻击技术的基本原理。 实验内容 Webgoat实践下相关实验。 实验环境 macOS下Parallels Desktop虚拟机中(网络源均设置为共享网络模式): Kali Linux - 64bit(攻击机,IP为10.211.55.10)…

C++ OCR证件照文字识别

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

科研绘图系列:R语言绘制韦恩图(Venn plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据处理画图系统信息介绍 R语言绘制韦恩图(Venn plot) 加载R包 library(tidyverse) library(ggplot2) library(ggrepel) library(dplyr) library(rea…

docker安装mysql5.7

1、宿主机创建映射目录 mkdir -p /data/mysql/log mkdir -p /data/mysql/data mkdir -p /data/mysql/conf这里我放在了/data/mysql目录下 2、拉取mysql镜像 docker pull mysql:5.7注意是5.7版本,如果是8版本操作会略有不同,下篇文章介绍安装8版本的操…

HTTP 协议

文章目录 1. 预备知识1.1 域名1.2 url 2. http请求和响应的格式2.1 http request2.2 http response2.3 使用telnet看一下http response2.4 使用fiddler来进行抓包,看一下http request 3. 写一个简单的httpserver3.1 基础框架3.2 web根目录3.3 拿到url,更…

vlan和vlanif

文章目录 1、为什么会有vlan的存在2、vlan(虚拟局域网)1、vlan原理1. 为什么这样划分了2、如何实现不同交换机相同的vlan实现互访呢3、最优化的解决方法,vlan不同交换机4、vlan标签和vlan数据帧 5、vlan实现2、基于vlan的划分方式1、基于接口的vlan划分方式2、基于m…

spring使用rabbitmq当rabbitmq集群节点挂掉 spring rabbitmq怎么保证高可用,rabbitmq网络怎么重新连接

##spring rabbitmq代码示例 Controller代码 import com.alibaba.fastjson.JSONObject; import com.newland.mi.config.RabbitDMMQConfig; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageProperties; import org.springframewo…

Mac/Linux 快速部署TiDB

1.下载TiUP TiDB 是一个分布式系统。最基础的 TiDB 测试集群通常由 2 个 TiDB 实例、3 个 TiKV 实例、3 个 PD 实例和可选的 TiFlash 实例构成。通过 TiUP Playground,可以快速搭建出上述的一套基础测试集群,步骤如下: curl --proto https -…