Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理无效的流标头异常:0000000 1?_Java_Serialization_Deserialization_Objectinputstream - Fatal编程技术网

Java 如何处理无效的流标头异常:0000000 1?

Java 如何处理无效的流标头异常:0000000 1?,java,serialization,deserialization,objectinputstream,Java,Serialization,Deserialization,Objectinputstream,我发现了这个,这似乎是一个常见的问题。如果您写入包含文件的目录,然后在以后手动删除其中一个,则最终会出现此错误 java.io.StreamCorruptedException: invalid stream header: 00000001 at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806) at java.io.ObjectInputStream.<init>(Ob

我发现了这个,这似乎是一个常见的问题。如果您写入包含文件的目录,然后在以后手动删除其中一个,则最终会出现此错误

java.io.StreamCorruptedException: invalid stream header: 00000001
     at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806)
     at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
所以现在的情况是,有一个名为Song的对象数据库。歌曲被序列化到我的家庭图书馆的文件夹中。我可以看到这些文件,它们确实被完全反序列化了。该程序在运行时没有问题,只是看到出现无效流头异常很烦人,我不想以后再遇到问题


除了“写入目录后不要触摸该目录”之外,我如何处理此异常?

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

除了“写入目录后不要触摸该目录”之外,我如何处理此异常

其他方法包括:

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

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

  • 捕获并忽略
    StreamIgnoredException
    ,尽管这有点冒险。(该文件可能是由于其他原因损坏的正版序列化对象……您需要了解它。)


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

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);
    }
}