2016-02-08 5 views
0

Выход правильный, но за ним следует EOFException. Я прочитал документацию, но до сих пор я не знаю, как решить этуEOFException от чтения файла

try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.bin"))){ 
    for(Ser s = (Ser)ois.readObject(); s!=null; s=(Ser)ois.readObject()) 
     System.out.println(s); 
}catch (IOException | ClassNotFoundException e){ 
    e.printStackTrace(); 
} 
+0

После того как вы прочитали все объекты, прекратите чтение из ObjectInputStream. Если вы не знаете, сколько объектов есть, напишите счет ObjectOutputStream перед тем, как записать в него объекты. Еще проще, если у вас нет большого количества объектов, нужно написать массив. (Не записывайте Список, для чтения списка потребуется небезопасный листинг.) – VGR

+0

Вы создаете файл 'file.bin'? Если да, то как вы это делаете? –

+0

@ VGR Чтение * ничего * из потока объектов требует небезопасного перевода. Притворство графа не всегда практично, и также бессмысленно, учитывая, что 'EOFException' уже существует. – EJP

ответ

2

Вы полагаете, что readObject возвращает нулевое значение, если нет данных, но на самом деле он бросает EOFException. Самым простым способом исправить это просто поймать исключение:

try(...) { 
    for(;;) { 
     Ser s = (Ser)ois.readObject(); 
     System.out.println(s); 
    } 
} catch(EOFException e) { 
    // normal loop termination 
} catch(IOException | ClassNotFoundException e){ 
    // error 
} 

Имейте в виду, что некоторые люди и стандарты кодирования считают плохой практикой, что исключение брошено в условиях без ошибок, как достижение конца ввода в этом случае.

+0

Это невезение, потому что это то, что происходит, поэтому им просто придется смириться с этим. – EJP