Как мне обработать исключение заголовка недопустимого потока: 00000001?
java.io.StreamCorruptedException: неверный заголовок потока: 00000001 Простой проект
Я нашел это, и это, кажется, общая проблема. Если вы напишите в каталог с файлами, а затем удалите его вручную, вы в конечном итоге получите эту ошибку.
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. Песни сериализуются в папку в моей домашней библиотеке. Я вижу файлы, и они полностью десериализуются. У программы нет проблем с запуском, просто досадно видеть всплывающее исключение Invalid Stream Header, и я не хочу, чтобы позже возникали проблемы.
Как мне справиться с этим исключением, кроме "Не трогать этот каталог после того, как он будет записан"?
1 ответ
По сути, это означает, что файл, который вы пытаетесь прочитать, не содержит сериализованный объект.
Как мне справиться с этим исключением, кроме "Не трогать этот каталог после того, как он будет записан"?
Другими способами являются:
Десериализуйте только те файлы, имя файла которых будет использовать ваше приложение.
Отфильтруйте конкретные имена файлов, которые могут быть подозрительными; например, на Mac - имя скрытого файла, который содержит метаданные каталога.
Лови и игнорируй
StreamIgnoredException
Хотя это немного рискованно. (Файл может быть подлинным сериализованным объектом, который поврежден по какой-то другой причине... и вам необходимо знать об этом.)
Кстати, иметь дело с такими исключениями, как вы, - плохая идея. Если исключение действительно ожидается, то вы не хотите печатать трассировку стека. Если это неожиданно, то может быть целесообразно прекратить загрузку каталога и разрешить распространение исключения. По крайней мере, вы должны сообщить, что при загрузке возникли проблемы с вызывающим абонентом. (С другой стороны, пользователь не должен сталкиваться с трассировкой стека, если программа... эээ... работает.)