目录
- 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,是线程安全的键值对存储结构
- Properties 可保存在流中或从流中加载
- 只能保存字符串的键值对。
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 码。
选择合适的编码方式可以提高效率。