java中序列化流类的使用
一、序列化输出流类
功能:一个能将对象存储到文件中的输出流类,类名为ObjectOutputStream。
使用步骤:
1、创建字节输入流对象,例如FileOutputStream对象,构造方法中传递写入的文件或者文件路径和是否续写标志,当续写标志省略时,
默认为false,即将原有文件覆盖。
2、创建序列化输出流类对象,即ObjectOutputStream对象,构造方法中传递字节输入流对象,例如FileOutputStream对象。
3、调用对象写入数据的方法写入数据,例如write()、writeObject()、writeBoolean()等。如果需要写入对象,则需要调用writeObject()方法。
4、调用close方法释放资源。
注意事项:
1、建议写入数据时只调用一种写入数据的方法,否则读取数据时容易报错。
2、写入对象必须使用writeObject方法。
1.1 构造方法
功能:创建序列化输入流类对象,构造方法中传递字节输入流对象,例如FileOutputStream对象。
用法:ObjectOutputStream 对象名 = new ObjectOutputStream(字节输出流类对象);
示例:
//创建文件字节输入流对象
FileOutputStream fos = new FileOutputStream(“src\objectstream\a.txt”);
//创建序列化输出流类对象
ObjectOutputStream oos = new ObjectOutputStream(fos);
1.2 常用方法
1.2.1 writeObject()
功能:将对象写入文件的方法。
用法:ObjectOutputStream对象名.writeObject(对象)
示例:
//创建对象
Person p1 = new Person(“七七”, 500);
//调用writeObject方法写入数据
oos.writeObject(p2);
注意事项:当需要写入多个对象时有两种方法,第一种方法也是最常用的方法为将对象存储到集合(例如:ArrayList集合)中,然后调用
writeObject方法将集合存储到文件中;第二种方法是多次调用writeObject方法写入对象。
1.2.2 write()
功能:将单个字节的数据或者多个字节的数据写入文件。
用法:
1、write(int val):向文件中写入一个整数。
参数 int val 需要写入的整数。
用法 对象.write(整数)
示例 oos.write(97)
2、write(byte[] buf):向文件中写入byte数组的数据,字符串可以转换为byte数组然后写入文件。
参数 byte[] buf 需要写入的byte数组
用法 对象.write(byte数组)
示例 oos.write(“abc”.getBytes());
3、write(byte[] buf, int off, int len):向文件中写入byte数组从off开始len长度的数据。
参数 byte[] buf 需要写入的byte数组
int off 写入的开始位置
int len 写入长度
用法 对象.write(byte数组, 开始位置, 长度)
示例:oos.write(“abcdefgh”.getBytes(), 0, 5);
1.2.3 close()
功能:关闭序列化输出流释放资源。
用法:对象.close()
示例:oos.close()
序列化输出流示例:
对象类
package objectstream;
import java.io.Serializable;
/**
* 定义一个表示人的类,继承Serializable接口
*/
public class Person implements Serializable {
//常用变量
private String name; //表示姓名的变量
private int age; //表示年龄的变量
//构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
//get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
序列化输出流使用类
package objectstream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
* 序列化输出流的使用
*/
public class ObjectOutputStream01 {
public static void main(String[] args) throws IOException {
// 创建Person对象
Person p1 = new Person("七七", 500);
Person p2 = new Person("可莉", 400);
System.out.println(p1);
//创建文件字节输入流对象
FileOutputStream fos = new FileOutputStream("src\\objectstream\\a.txt");
//创建序列化输出流类对象
ObjectOutputStream oos = new ObjectOutputStream(fos);
//调用writeObject()方法写入对象
oos.write(97);
oos.writeObject(p1);
oos.writeObject(p2);
//调用close方法释放资源
oos.close();
}
}
二、序列化输入流
功能:一个将文件中的对象数据读取到内存中的类,即反序列化过程,类名为ObjectInputStream。
使用步骤:
1、创建字节输入流对象,例如FileInputStream对象,构造方法中传递读取的文件或者文件路径。
2、创建序列化输入流类对象,构造方法中传递字节输入流对象,例如FileInputStream对象。
3、调用对象的读取文件的方法,例如read()、readObject()。
4、调用对象的close方法释放资源。
注意事项:
1、读取文件中数据时要根据使用的写入方法调用对应读取数据,例如写入使用write方法,读取则需要调用read方法。
2、读取文件中的多个对象时需要try catch抛出异常作为结束标志。
2.1 构造方法
功能:创建序列化输入流对象,即ObjectInputStream对象,构造方法中传递字节输入流对象,例如FileInputStream对象。
用法:ObjectInputStream 对象名 = new ObjectInputStream(字节输入流对象)
示例:
//创建文件字节输入流对象
FileInputStream fis = new FileInputStream(“src\objectstream\a.txt”);
//创建序列化输入流对象
ObjectInputStream ois = new ObjectInputStream(fis);
2.2 常用方法
2.2.1 readObject()
功能:读取文件中的一个对象数据并返回。
用法:Object o = 对象名.readObject()
示例:Object o = ois.readObject()
注意事项:
1、方法返回的数据是Object类型,如果需要转换为数据对应的对象,可以使用强制类型转换,例如数据为Person类数据,
则使用Person p = (Person)o。
2、当文件中存储多个对象数据时需要使用try catch抛出异常作为结束标志。
示例:try {
while (true){
//调用readObject()方法读取数据
Object o = ois.readObject();
System.out.println(o);
}
}catch (EOFException e){
System.out.println(“文件读取完成”);
}
2.2.2 close()
功能:关闭序列化输出流释放资源。
用法:对象.close()
示例:ois.close()
2.2.3 read()
功能:读取单个或者多个字节的数据,文件读取完成标志为-1。
用法:
1、read():读取单个字节的数据并返回。
用法:int value = 对象名.read()
示例:int value = ois.read();
2、read(byte[]):读取多个字节缓存到byte数组中并返回读取数据长度,结束标志为-1。
用法:int len = 对象名.read(byte数组)
示例:byte[] bytes = new bytes[8]
int len = ois.read(bytes)
序列化输入流示例:
package objectstream;
import java.io.*;
/**
* 序列化输入流类的使用
*/
public class ObjectInputStream01 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建文件字节输入流对象
FileInputStream fis = new FileInputStream("src\\objectstream\\a.txt");
//创建序列化输入流对象
ObjectInputStream ois = new ObjectInputStream(fis);
int len = ois.read();
System.out.println(len);
try {
while (true){
//调用readObject()方法读取数据
Object o = ois.readObject();
System.out.println(o);
}
}catch (EOFException e){
System.out.println("文件读取完成");
}finally {
//调用close方法释放资源
ois.close();
}
}
}