IO流——对象流(ObjectOutputStream&ObjectInputStream)

本文深入探讨Java中对象流(ObjectOutputStream和ObjectInputStream)的概念与应用,讲解如何使用对象流进行对象的持久化及从磁盘读取。重点介绍自定义类实现Serializable接口的方法,并通过代码示例展示ArrayList和自定义类的序列化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ObjectOutputStream

将对象持久化(永久保存在磁盘上)
注意:要保存的对象的类要实现序列化接口(serializable)
构造方法

protected ObjectOutputStream()throws IOException,SecurityException

public ObjectOutputStream(OutputStream out)throws IOException

Code:
持久化ArrayList

List<String> arrayList = new ArrayList<>();
arrayList.add("对");
arrayList.add("象");
arrayList.add("流");
arrayList.add("测");
arrayList.add("试");
		
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:/w.txt"));
//将arrayList持久化
oos.writeObject(arrayList);

持久化自定义类的对象:

/**
 * @author maple
 *持久化Student, 要实现Serializable接口
 */
public class Student implements Serializable{
/**
	 * serialVersionUID:  这个值,是在两端【不同的电脑  对象传递之后,比较类型的一个依据】
	 * 1.本电脑创建了一个学生对象
	 * 2.当我们把这个对象传递到其他电脑的时候,这个对象,要与其他电脑里面的Student类比较类型	是否一致
	 * 3.除了判断类型,还会判断serialVersionUID
	 */
	private static final long serialVersionUID = 1L;
	private String name;
	private int age;
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
}

//自己新建一个测试类,将主方法拷贝过去
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		Student stu1 = new Student("小米",4);
		Student stu2 = new Student("苹果",6);
		
		//进行持久化
		/*ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:/x.txt"));
		oos.writeObject(stu1);
		oos.writeObject(stu2);
		//这里在最后放入null是为了标志已经到末尾了
		oos.writeObject(null);*/
		
		
		
	}

ObjectInputStream

将持久化的对象拿出来
构造方法

protected ObjectInputStream()throws IOException,SecurityException

public ObjectInputStream(InputStream in)throws IOException
//读取上面持久化的arrayList
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:/w.txt"));
Object readObject = ois.readObject();
System.out.println(readObject);

读取上面自定义Student类的对象

//将持久化的数据拿出来
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:/x.txt"));
/*Object object1 = ois.readObject();
Object object2 = ois.readObject();

System.out.println(object1);
System.out.println(object2);*/
Object obj = null;
while ((obj = ois.readObject()) != null) {
	System.out.println(obj);
}
### Java IO 对象流的使用方法 在Java中,`ObjectInputStream` 和 `ObjectOutputStream` 类用于序列化和反序列化对象。这允许程序将对象保存到文件或将对象从文件加载回内存。 #### 序列化对象至文件 为了实现这一功能,首先需要创建一个实现了 `Serializable` 接口的对象实例。接着可以利用 `FileOutputStream` 来指定目标文件路径,并通过 `ObjectOutputStream` 将对象写入该文件[^1]。 ```java import java.io.*; public class SerializeExample { public static void main(String[] args) throws IOException { User user = new User("John", "Doe"); try (FileOutputStream fos = new FileOutputStream("user.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(user); } } private static class User implements Serializable { private String firstName; private String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } } } ``` #### 反序列化对象自文件 当要恢复之前存储的对象状态时,则需采用相反的过程——即先打开相同的文件作为输入源(`FileInputStream`),再借助于 `ObjectInputStream` 完成读取操作并重建原始对象结构。 ```java import java.io.*; public class DeserializeExample { public static void main(String[] args) throws IOException, ClassNotFoundException { User loadedUser; try (FileInputStream fis = new FileInputStream("user.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) { loadedUser = (User) ois.readObject(); System.out.println(loadedUser.getFirstName() + " " + loadedUser.getLastName()); } } private static class User implements Serializable { private String firstName; private String lastName; @Override public String getFirstName() { return firstName; } @Override public String getLastName() { return lastName; } } } ``` 上述代码展示了如何使用Java中的对象流来处理数据持久化的具体例子。需要注意的是,在实际应用开发过程中应当考虑安全性问题以及版本兼容性等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值