如何处理无效流标头例外:00000001?

时间:2015-03-07 06:43:16

标签: java serialization deserialization objectinputstream

java.io.StreamCorruptedException: invalid stream header: 00000001 Simple Project

我发现了这一点,这似乎是一个常见的问题。如果您使用文件写入目录,然后稍后手动删除,则最终会收到此错误。

java.io.StreamCorruptedException: invalid stream header: 00000001
     at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806)
     at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)

代码:

private void deserialize(File input){
    // Let's deserialize an Object
    System.out.println("Here");
    try {
                FileInputStream fileIn = new FileInputStream(input); 
                ObjectInputStream in = new ObjectInputStream(fileIn);
                    //System.out.println("Deserialized Data: \n" + ((Song)in.readObject()));
                    database.add((Song)in.readObject());
                in.close();
                fileIn.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException ex) {
                    Logger.getLogger(Runner.class.getName()).log(Level.SEVERE, null, ex);
    }
}

private void open(){
    for(File fIn: f.listFiles()){
        deserialize(fIn);
    }
}

所以最新的是有一个名为Song的对象数据库。歌曲被序列化到我家图书馆的文件夹中。我可以看到文件,他们确实完全反序列化。该程序运行没有问题,只是看到弹出无效流标题异常很烦人,我不希望以后出现问题。

如何处理此异常,而不是“写入后不要触摸该目录”?

1 个答案:

答案 0 :(得分:0)

基本上,这意味着您尝试读取的文件不包含序列化对象。

  

如何处理此异常,而不是“写入后不要触摸该目录”?

其他方式是:

  • 仅对文件名为应用程序将使用的文件进行反序列化。

  • 过滤掉可能可疑的特定文件名;例如在Mac上,包含目录元数据的隐藏文件的名称。

  • 抓住并忽略StreamIgnoredException,虽然这有点冒险。 (该文件可能是一个真正的序列化对象,由于其他原因而被破坏......你需要了解它。)


顺便说一下,处理像你这样的异常是一个坏主意。如果真的需要异常,那么您不希望打印堆栈跟踪。如果是意外的,则建议停止加载目录,并允许传播异常。至少,您需要向调用者报告负载有问题。 (另一方面,如果程序正在运行,用户不应该面对堆栈跟踪。)