5

假设您有一些 AppendObjectOutputStream 类(它是一个 ObjectOutputStream!),它像这样覆盖 writeStreamHeader():

@Override
public void writeStreamHeader() throws IOException
{
    reset();
}

现在,假设您计划将多个对象保存到一个文件中;程序每次运行时对应一个对象。即使在第一次运行时,您会使用 AppendObjectOutputStream() 吗?

4

2 回答 2

13

您必须第一次使用常规 ObjectOutputStream 编写流标头,否则在使用 ObjectInputStream 打开文件时您将收到 java.io.StreamCorruptedException。

public class Test1 implements Serializable {

    public static void main(String[] args) throws Exception {
        ObjectOutputStream os1 = new ObjectOutputStream(new FileOutputStream("test"));
        os1.writeObject(new Test1());
        os1.close();

        ObjectOutputStream os2 = new ObjectOutputStream(new FileOutputStream("test", true)) {
            protected void writeStreamHeader() throws IOException {
                reset();
            }
        };

        os2.writeObject(new Test1());
        os2.close();

        ObjectInputStream is = new ObjectInputStream(new FileInputStream("test"));
        System.out.println(is.readObject());
        System.out.println(is.readObject());
于 2013-03-25T05:12:41.497 回答
0

以上对我不起作用,特别是 reset() 不起作用。我在这里找到以下内容: https ://coderanch.com/t/583191/java/ObjectOutputStream-appending-file-overiding-ObjectOutputStream

@Override 
protected void writeStreamHeader() throws IOException {  
   // TODO Auto-generated method stub  
   System.out.println("I am called");  
   super.writeStreamHeader();
}  

这对我有用。我知道这似乎违反直觉,乍一看,调用超类方法似乎不应该做任何事情,但确实如此。阅读原始帖子并尝试一下。

于 2021-02-09T15:13:27.933 回答