Java 中的 ObjectOutputStream - 将对象写入文件

ObjectOutputStream 在 Java 中可以用来将对象转换为 OutputStream. 将对象转换为流的过程称为 serialization in java. 一旦对象转换为 Output Stream,它可以保存到文件或数据库,通过网络发送或用于插件连接。 因此,我们可以使用 FileOutputStream 将对象写到文件中。

对象流

ObjectOutputStream 是 Java IO类的一部分,其整个目的是为我们提供一种方法来将 java 对象转换为流. 当我们创建一个 ObjectOutputStream 实例时,我们必须提供要使用的 OutputStream。

ObjectOutputStream要求

我们要 serialize 的对象应该实现 java.io.Serializable 界面。 Serializable 只是一个标记界面,没有我们必须实施的任何抽象方法。如果类别不实现 Serializable 界面,我们将得到 java.io.NotSerializableException

1java.io.NotSerializableException: com.journaldev.files.EmployeeObject
2    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
3    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
4    at com.journaldev.files.ObjectOutputStreamExample.main(ObjectOutputStreamExample.java:21)

Java ObjectOutputStream 写对象到文件的示例

Le,t 看看 java ObjectOutputStream 示例来写一个对象到文件. 为此,首先,我们应该有一个类有某些属性. 让我们创建一个对象,我们将保存到文件。

 1package com.journaldev.files;
 2
 3import java.io.Serializable;
 4
 5public class Employee implements Serializable {
 6
 7    private static final long serialVersionUID = -299482035708790407L;
 8
 9    private String name;
10    private String gender;
11    private int age;
12
13    private String role;
14    // private transient String role;
15
16    public Employee(String n) {
17    	this.name = n;
18    }
19
20    public String getGender() {
21    	return gender;
22    }
23
24    public void setGender(String gender) {
25    	this.gender = gender;
26    }
27
28    public int getAge() {
29    	return age;
30    }
31
32    public void setAge(int age) {
33    	this.age = age;
34    }
35
36    public String getRole() {
37    	return role;
38    }
39
40    public void setRole(String role) {
41    	this.role = role;
42    }
43
44    @Override
45    public String toString() {
46    	return "Employee:: Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + " Role=" + this.role;
47    }
48
49}

请注意,对于所有属性来说,这不是一个要求的 getter/setter。 或者有一个 no-argument constructor。 正如你可以看到的,上面的 Employee 对象对于名称属性没有 getter/setter 方法。 它也没有 no-argument constructor。 这里是如何使用 ObjectOutputStream 写 Object 到 java 文件的程序。

 1package com.journaldev.files;
 2
 3import java.io.FileOutputStream;
 4import java.io.IOException;
 5import java.io.ObjectOutputStream;
 6
 7public class ObjectOutputStreamExample {
 8
 9    public static void main(String[] args) {
10    	Employee emp = new Employee("Pankaj");
11
12    	emp.setAge(35);
13    	emp.setGender("Male");
14    	emp.setRole("CEO");
15    	System.out.println(emp);
16    	
17    	try {
18    		FileOutputStream fos = new FileOutputStream("EmployeeObject.ser");
19    		ObjectOutputStream oos = new ObjectOutputStream(fos);
20    		// write object to file
21    		oos.writeObject(emp);
22    		System.out.println("Done");
23    		// closing resources
24    		oos.close();
25    		fos.close();
26    	} catch (IOException e) {
27    		e.printStackTrace();
28    	}
29    }
30
31}

Below image shows the output of the above program. java ObjectOutputStream example to write object to file If you are wondering what is the content of EmployeeObject.ser file, it's a bit garbled and something like below.

1��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO

ObjectOutputStream 与过渡性

如果我们不希望某些对象属性被转换为流,我们必须使用暂时的关键字。

1private transient String role;

ObjectOutputStream 和 serial 版本UID

你是否注意到员工对象中定义的serialVersionUID吗?它被ObjectOutputStreamObjectInputStream类用于写作和读取对象操作,虽然没有强制性,但你应该保持它。否则,每次你改变你的类,不会影响以前的序列化对象,它将开始失败。为了详细的分析,转到 Serialization in Java

1FileInputStream is = new FileInputStream("EmployeeObject.ser");
2ObjectInputStream ois = new ObjectInputStream(is);
3Employee emp = (Employee) ois.readObject();
4
5ois.close();
6is.close();
7System.out.println(emp.toString());
8//Output will be "Employee:: Name=Pankaj Age=35 Gender=Male Role=CEO"

这是关于 java ObjectOutputStream 以及如何使用它来写对象到文件。

您可以从我们的 GitHub 存储库中查阅更多 Java IO 示例。

引用: API Doc

Published At
Categories with 技术
Tagged with
comments powered by Disqus