2015-03-07 3 views
0

java.io.StreamCorruptedException: invalid stream header: 00000001 Simple ProjectКак обрабатывать заголовок Invalid Stream Исключение: 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); 
    } 
} 

Так что происходит в том, что существует база данных объектов называется песня. Песни сериализуются в папку в моей домашней библиотеке. Я вижу файлы, и они полностью десериализуются. У программы нет проблем с запуском, просто досадно видеть всплывающее окно Invalid Stream Header Exception, и я не хочу иметь проблемы позже.

Как я могу справиться с этим исключением, кроме «Не прикасаться к этому каталогу после его написания»?

ответ

0

В основном это означает, что файл, который вы пытаетесь прочитать, не содержит сериализованного объекта.

Как я могу справиться с этим исключением, кроме «Не прикасаться к этому каталогу после его написания»?

Другие способы являются:

  • только десериализации файлы, имя файла один, что ваше приложение будет использовать.

  • Отфильтровать определенные имена файлов, которые могут быть подозрительными; например на Mac, имя скрытого файла, содержащего метаданные каталога.

  • Поймать и проигнорировать StreamIgnoredException, хотя это немного рискованно. (Файл может быть подлинным сериализованный объект, который поврежден по какой-то другой причине ... и вы должны знать об этом.)


Кстати, дело с исключениями, как вы делаете плохая идея. Если исключение действительно ожидаемо, то вы не хотите печатать stacktrace. Если это неожиданно, тогда может оказаться целесообразным прекратить загрузку каталога и разрешить распространение исключения. По крайней мере, вам нужно сообщить, что у загрузки были проблемы с вызывающим абонентом. (С другой стороны, пользователь не должен сталкиваться со стековыми следами, если программа ... erm ... функционирует.)

Смежные вопросы