JAVA中的序列化和反序列化,编码转换流的应用
1. 序列化和反序列化
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
1、序列化:利用ObjectOutputStream,对象的信息,按固定格式转成一串字节值输出并持久保存到磁盘化。
2、反序列化:利用ObjectInputStream,读取磁盘中序列化数据,重新恢复对象。
注意:
1、 需要序列化的文件必须实现Serializable接口以启用其序列化功能。
2、 每个被序列化的文件都有一个唯一id,如果没有添加编译器会根据类的定义信息计算产生一个版本号。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Test {
public static void main(String[] args) throws Exception, IOException {
//序列化:就是把java对象保存在磁盘中
ObjectOutputStream os =
new ObjectOutputStream(
new FileOutputStream(
"D:\\teach\\a\\student.txt"));
Student s = new Student("张三",20,"成都");
os.writeObject(s);//序列化,把Student对象信息保存到指定文件中
os.close();//关闭输出资源
//反序列化:从磁盘读到程序里
ObjectInputStream in =
new ObjectInputStream(
new FileInputStream(
"D:\\teach\\a\\student.txt"));
//反序列化,把文件里的数据读到程序中,封装成对象,默认是Object
Object obj =in.readObject();
System.out.println(obj);
}
}
//1,如果想完成序列化,类必须实现Serializable接口
//只是用来做标记,需要序列化
class Student implements Serializable{
//创建对象用
public Student(String name, int age, String addr) {
this.name = name;
this.age = age;
this.addr = addr;
}
//一般序列化的都是属性
String name = "张三";
int age = 20;
String addr = "成都";
//为了看属性值
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", addr=" + addr + "]";
}
}
2. 编码转换流
用来作为桥梁,把字节流转成字符流的桥梁。用来解决字符流读写乱码问题。
2.1工具类:
OutputStreamWriter:是字节流通向字符流的桥梁
--OutputStreamWriter(OutputStream out, String charsetName)
--OutputStreamWriter(OutputStream out)
InputStreamReader:是字节流通向字符流的桥梁
--InputStreamReader(InputStream in)
--InputStreamReader(InputStream in, String charsetName)
2.2案例
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
//编码转换流的测试
public class Test {
public static void main(String[] args) {
// method();//输出的转换流
method2();//读取的转换流
}
private static void method2() {
try {
//1,创建转换对象
//第二个参数可以设置编码表,解决乱码现象
//文件保存时使用的是gbk编码,如果用utf-8就会乱码
// BufferedReader in = new BufferedReader(
// new InputStreamReader(
// new FileInputStream("1.txt"),"utf-8"));//乱码
BufferedReader in = new BufferedReader(
new InputStreamReader(
new FileInputStream("1.txt"),"gbk"));
//2,读取一行数据
String line = in.readLine();//子类BufferedReader的特有方法
System.out.println(line);
//3,释放资源
}catch(Exception e) {
e.printStackTrace();
}
}
private static void method() {
try {
// 1,创建转换流输出对象,OutputStreamWriter是字节流通向字符流的桥梁
//第二个参数可以设置编码表,解决乱码现象
//写出去的文件如果使用了utf-8表,打开时,使用了默认的gbk编码表,就会出现乱码
// OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("1.txt"), "utf-8");
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("1.txt"), "gbk");
// 2,开始写出数据
// 当数据的保存方式和打开方式,使用的不是一张表时,就会出现乱码!!
out.write("大家好,我是渣渣辉");
// TODO 3,释放资源
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}