Я пишу программу, где объекты сериализуются в документе под названием "Books.ser"
FileOutputStream fos = new FileOutputStream("Books.ser");
ObjectOutputStream os = new ObjectOutputStream(fos);
for (int i = 1; i < 1000; i++) {
os.writeObject(shelf.book[i]);
}
os.close();
Есть ли способ открыть и просмотреть этот документ? Если нет, я просто хотел бы знать, если Java сериализует объекты, которые еще не были инициализированы. (ноль)
Ну, противоположный цикл должен делать.
FileInputStream is = new FileInputStream("Books.ser");
ObjectInputStream ois = new ObjectInputStream(is);
for (int i = 1; i < 1000; i++) {
Object o = os.readObject();
// Do something with o - e.g. add to a List
}
ois.close();
Из JavaDoc:
ObjectOutputStream записывает примитивные типы данных и графики объектов Java в OutputStream. Объекты могут быть прочитаны (восстановлены) с помощью ObjectInputStream. Постоянное хранение объектов может быть выполнено с помощью файла для потока.
Итак, в основном вы пишете примитивы (например, writeInt
) или объекты (writeObject
) с ObjectOutputStream
а затем вы читаете их с помощью ObjectInputStream
с соответствующим read
-methods.
Если OutputStream знает тип объекта, который должен быть сериализован, он также работает с нулевыми значениями. Например
public static class MyClass implements Serializable {
private final String content;
public MyClass(final String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
@Test
public void testWriteObject() throws IOException, ClassNotFoundException {
MyClass nullInstance = null;
MyClass notNullInstance = new MyClass("This content is not null");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream os = new ObjectOutputStream(baos)) {
os.writeObject(nullInstance);
os.writeObject(notNullInstance);
}
try (ObjectInputStream is =
new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
MyClass shouldBeNull = (MyClass) is.readObject();
MyClass shouldNotBeNull = (MyClass) is.readObject();
Assert.assertNull(shouldBeNull);
Assert.assertNotNull(shouldNotBeNull);
// Attributes are serialized too
Assert.assertEquals("This content is not null", shouldNotBeNull.getContent());
}
}
При использовании классов InputStream
и OutputStream
рекомендуется использовать конструкцию try-with-resources (от Java 7).
try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("Books.ser"))) {
// loop and serialize...
} catch (IOException e) {
// Handle exception
}