Java ObjectOutput 接口
最后修改时间:2025 年 4 月 16 日
java.io.ObjectOutput 接口扩展了 DataOutput,并提供了用于写入对象和基本数据类型的方法。它主要用于 Java 中的对象序列化。实现此接口的类可以将对象写入流。
ObjectOutput 由 ObjectOutputStream 和其他需要序列化对象的类实现。它结合了 DataOutput 的功能和对象写入能力。此接口对于 Java 的序列化机制至关重要。
ObjectOutput 接口概述
ObjectOutput 提供了用于写入基本类型和对象的方法。关键方法包括用于序列化对象的 writeObject 和用于基本类型的各种写入方法。该接口还包括刷新和关闭操作。
public interface ObjectOutput extends DataOutput, AutoCloseable {
void writeObject(Object obj) throws IOException;
void write(int b) throws IOException;
void write(byte[] b) throws IOException;
void write(byte[] b, int off, int len) throws IOException;
void flush() throws IOException;
void close() throws IOException;
// DataOutput methods...
}
上面的代码显示了 ObjectOutput 提供的关键方法。这些方法允许将对象和基本数据类型写入输出流。该接口扩展了 DataOutput 和 AutoCloseable。
将对象写入文件
此示例演示了使用 ObjectOutput 进行基本对象序列化。我们创建一个简单的类,实现 Serializable,并将一个实例写入文件。 ObjectOutputStream 实现了 ObjectOutput。
import java.io.*;
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class Main {
public static void main(String[] args) {
try (ObjectOutput out = new ObjectOutputStream(
new FileOutputStream("person.dat"))) {
Person person = new Person("John Doe", 30);
out.writeObject(person);
System.out.println("Person object written to file");
} catch (IOException e) {
e.printStackTrace();
}
}
}
此示例创建一个实现 Serializable 的 Person 类。然后,我们创建一个实例并使用 ObjectOutput 将其写入文件。 try-with-resources 确保了流的正确关闭。序列化数据以二进制格式写入。
写入基本数据类型
ObjectOutput 从 DataOutput 继承了基本类型写入方法。此示例演示了如何将各种基本类型写入文件。这些方法与 DataOutputStream 中的方法类似。
import java.io.*;
public class Main {
public static void main(String[] args) {
try (ObjectOutput out = new ObjectOutputStream(
new FileOutputStream("primitives.dat"))) {
out.writeBoolean(true);
out.writeByte(65); // 'A'
out.writeChar('B');
out.writeDouble(3.14159);
out.writeFloat(2.718f);
out.writeInt(42);
out.writeLong(123456789L);
out.writeShort(32767);
System.out.println("Primitives written to file");
} catch (IOException e) {
e.printStackTrace();
}
}
}
此示例使用 ObjectOutput 方法将各种基本类型写入文件。每个方法都以二进制格式写入其特定类型。可以使用 ObjectInput 中相应的方法将数据读回。写入顺序必须与读取顺序匹配。
写入字节数组
ObjectOutput 提供了用于写入字节数组的方法。这些方法对于写入原始二进制数据很有用。这些方法可以写入整个数组或数组的一部分。这提供了数据输出的灵活性。
import java.io.*;
public class Main {
public static void main(String[] args) {
byte[] data = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; // "Hello" in ASCII
try (ObjectOutput out = new ObjectOutputStream(
new FileOutputStream("bytes.dat"))) {
// Write entire array
out.write(data);
// Write portion of array
out.write(data, 1, 3); // Writes 'ell'
System.out.println("Byte arrays written to file");
} catch (IOException e) {
e.printStackTrace();
}
}
}
此示例演示了使用 ObjectOutput 写入字节数组。首先,我们写入整个数组,然后写入数组的一部分。第二次写入使用偏移量和长度来指定要写入的字节。这对于分块处理大型数组很有用。
组合对象和基本类型
此示例展示了如何在单个流中混合对象和基本类型的写入。读取时必须保留写入顺序。此技术在复杂的序列化场景中很常见。
import java.io.*;
class Product implements Serializable {
private String name;
private double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Product{name='" + name + "', price=" + price + "}";
}
}
public class Main {
public static void main(String[] args) {
try (ObjectOutput out = new ObjectOutputStream(
new FileOutputStream("combined.dat"))) {
// Write primitive header
out.writeUTF("PRODUCT_DATA");
out.writeInt(1); // Version
// Write object
Product product = new Product("Laptop", 999.99);
out.writeObject(product);
// Write more primitives
out.writeLong(System.currentTimeMillis());
out.writeBoolean(true);
System.out.println("Combined data written to file");
} catch (IOException e) {
e.printStackTrace();
}
}
}
此示例写入一个字符串头、版本号、产品对象、时间戳和布尔标志。 writeUTF 方法以修改后的 UTF-8 格式写入字符串。读取时,必须按照写入的相同顺序读取数据。
刷新和关闭流
ObjectOutput 提供了 flush 和 close 方法。刷新确保将所有缓冲数据写入底层流。关闭会释放资源,并且应该在完成后始终执行。
import java.io.*;
public class Main {
public static void main(String[] args) {
ObjectOutput out = null;
try {
out = new ObjectOutputStream(
new FileOutputStream("flush_close.dat"));
out.writeUTF("Important data");
// Ensure data is written immediately
out.flush();
System.out.println("Data flushed to file");
// Write more data
out.writeInt(42);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
System.out.println("Stream closed");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
此示例演示了使用显式刷新和关闭操作进行手动流管理。 flush 确保立即写入数据,这对于关键操作很重要。 finally 块保证即使发生异常,流也会关闭。
来源
在本文中,我们涵盖了 Java ObjectOutput 接口的基本方法和特性。理解这些概念对于在 Java 应用程序中使用对象序列化至关重要。
作者
列出所有Java教程。