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的对象数据库。歌曲被序列化到我家图书馆的文件夹中。我可以看到文件,他们确实完全反序列化。该程序运行没有问题,只是看到弹出无效流标题异常很烦人,我不希望以后出现问题。
如何处理此异常,而不是“写入后不要触摸该目录”?
答案 0 :(得分:0)
基本上,这意味着您尝试读取的文件不包含序列化对象。
如何处理此异常,而不是“写入后不要触摸该目录”?
其他方式是:
仅对文件名为应用程序将使用的文件进行反序列化。
过滤掉可能可疑的特定文件名;例如在Mac上,包含目录元数据的隐藏文件的名称。
抓住并忽略StreamIgnoredException
,虽然这有点冒险。 (该文件可能是一个真正的序列化对象,由于其他原因而被破坏......你需要了解它。)
顺便说一下,处理像你这样的异常是一个坏主意。如果真的需要异常,那么您不希望打印堆栈跟踪。如果是意外的,则建议停止加载目录,并允许传播异常。至少,您需要向调用者报告负载有问题。 (另一方面,如果程序正在运行,用户不应该面对堆栈跟踪。)