如何处理无效流 header 异常:00000001?
How do I handle an Invalid Stream header Exception: 00000001?
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);
}
}
所以发生的事情是 Objects 有一个名为 Song 的数据库。歌曲被序列化到我家图书馆的一个文件夹中。我可以看到这些文件,它们确实被完全反序列化了。程序没有问题 运行,只是看到 Invalid Stream Header 异常弹出很烦人,我不想以后再有问题。
除了"Don't touch that directory after it's written to"之外,我该如何处理这个异常?
基本上,这意味着您要读取的文件不包含序列化对象。
How do I deal with this exception other than "Don't touch that directory after it's written to"?
其他方式有:
仅反序列化文件名是您的应用程序将使用的文件。
过滤掉可能可疑的特定文件名;例如在 Mac 上,包含目录元数据的隐藏文件的名称。
抓住并忽略 StreamIgnoredException
,尽管这有点冒险。 (该文件可能是一个真正的序列化对象,由于其他原因而损坏......您需要了解它。)
顺便说一句,像你这样处理异常是个坏主意。如果异常确实是预期的,那么您不想打印堆栈跟踪。如果它是意外的,那么最好停止加载目录,并允许异常传播。最起码,你需要向调用者报告负载有问题。 (另一方面,如果程序正在运行,用户不应该看到堆栈跟踪。)
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);
}
}
所以发生的事情是 Objects 有一个名为 Song 的数据库。歌曲被序列化到我家图书馆的一个文件夹中。我可以看到这些文件,它们确实被完全反序列化了。程序没有问题 运行,只是看到 Invalid Stream Header 异常弹出很烦人,我不想以后再有问题。
除了"Don't touch that directory after it's written to"之外,我该如何处理这个异常?
基本上,这意味着您要读取的文件不包含序列化对象。
How do I deal with this exception other than "Don't touch that directory after it's written to"?
其他方式有:
仅反序列化文件名是您的应用程序将使用的文件。
过滤掉可能可疑的特定文件名;例如在 Mac 上,包含目录元数据的隐藏文件的名称。
抓住并忽略
StreamIgnoredException
,尽管这有点冒险。 (该文件可能是一个真正的序列化对象,由于其他原因而损坏......您需要了解它。)
顺便说一句,像你这样处理异常是个坏主意。如果异常确实是预期的,那么您不想打印堆栈跟踪。如果它是意外的,那么最好停止加载目录,并允许异常传播。最起码,你需要向调用者报告负载有问题。 (另一方面,如果程序正在运行,用户不应该看到堆栈跟踪。)