2013-05-20 3 views
1

Я занимаюсь расписанием, и я сохраняю .txt все мои объекты, это прекрасно работает, проблема возникает, когда я читаю их, свою программу читает, когда наступает конец файла, моя программа не знает, что делать, я не стану использовать свой код, потому что сейчас это беспорядок, но вот код моего учителя, который я использую как шаблон сделать мину:Исключение с ObjectInputStream во время чтения и до конца файла

try{ 
    //***Instructions for reading*** 

    //It creates a streamobject with the file's name and asigned format 

    FileInputStream fileIn = new FileInputStream("Serializado.txt"); 

    //It creates an inputobject, so it can represent the object 

    ObjectInputStream objIn= new ObjectInputStream(fileIn); 

    while (fileIn != null) { 

    //with readObject() method, it extracts the object's content        

    obInp= (NewAlumno) objIn.readObject(); //Se hace un "cast" a NewAlumno 
    System.out.print("Nombre :" + obInp); 
    System.out.print(", Sexo: " + obInp.getSexo()); 
    System.out.print(", Direccion: "+ obInp.getDireccion());  
    System.out.print(", Promedio: " + obInp.getpromedioPoo()); 
    System.out.print(", Telefono: " + obInp.getTelefono()+"\n"); 
    } 

    objIn.close(); 
} catch(Exception e){} 

} 

Как вы можете видеть, исключение поймать его пуст, поэтому, когда я использовать код своего учителя, он выглядит как он безупречно работает, но я поставил Println там, и это всегда печатает его. Это означает, что что-то не так, и я уверен, что это

while(fileIn != null) 

bacause Netbeans говорит, что это выражение никогда не нуль. Так что я предполагаю, что программа не знает, что делать после того, как он достигнет конца файла ... Любые sugestions pals? Спасибо заранее!

Вот исключение:

java.io.EOFException 
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2‌​577) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
    at profegraba.Persistencia.main(Persistencia.java:81) 
+1

Поместите 'e.printStackTrace()' в предложение catch и опубликуйте результаты. –

+0

здесь: java.io.EOFException \t в java.io.ObjectInputStream $ BlockDataInputStream.peekByte (ObjectInputStream.java:2577) \t в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1315) \t на Java. io.ObjectInputStream.readObject (ObjectInputStream.java:369) \t at profegraba.Persistencia.main (Persistencia.java:81) –

+0

@HectorHammett Это исключение означает, что вы достигли конца файла, но вы по-прежнему запрашиваете больше объектов для читать. Программа больше не может читать, потому что она достигла конца файла, поэтому исключение вызывается. – afsantos

ответ

1

Это исключение означает, что вы достигли конца файла, но вы по-прежнему запрашиваете больше объектов для чтения. Программа больше не может читать, потому что она достигла конца файла, поэтому исключение вызывается.

Как уже упоминалось ранее, вы должны более тщательно обрабатывать свои ресурсы.

Вы должны поймать исключение и обращаться с ним естественным образом.

ObjectInputStream objIn = null; 
try { 
    FileInputStream fileIn = new FileInputStream("Serializado.txt"); 
    if (fileIn == null) { 
     throw new IOException("Can't find file."); 
    } 
    objIn= new ObjectInputStream(fileIn); 

    while (true) { 
     obInp= (NewAlumno) objIn.readObject(); 
     System.out.print("Nombre :" + obInp); 
     System.out.print(", Sexo: " + obInp.getSexo()); 
     System.out.print(", Direccion: "+ obInp.getDireccion());  
     System.out.print(", Promedio: " + obInp.getpromedioPoo()); 
     System.out.print(", Telefono: " + obInp.getTelefono()+"\n"); 
    } 
} catch (EOFException e) { 
    // Ignore or do whatever you wanted to signal the end of file. 
} catch (Exception ex) { 
    ex.printStrackTrace(); 
} finally { 
    try { 
     if (objIn != null) { 
      objIn.close(); 
     } 
    } catch (IOException closeException) { 
     closeException.printStackTrace(); 
    } 
} 
+1

Существует несколько правильных вариантов использования 'available()', и это не один из них. Он не говорит вам, достигли ли вы конца потока: он говорит вам, может быть, сколько байтов доступно для чтения без блокировки. Это совсем не то же самое. – EJP

+0

@EJP Действительно, хорошо подумал. Я исправлю свой ответ. Поймать исключение, безусловно, путь сюда. – afsantos

+0

Ого, спасибо всем, это значит, что я был в правильном направлении. Код моего профессора не знает, что делать с концом файла, а также я получаю идею от afsantos об использовании исключения для управления потоком программы, но также я получаю объяснение от @Duncan Jones. Очевидно, что «неправильно» использовать исключение для управления вашей программой ... но я думаю, что это очень хороший вариант из-за времени. Спасибо всем вам, ребята. –

2

Петля в то время как совершенно неправильно

while (fileIn != null) { 

Если входной файл существует, то fileIn всегда будет ненулевым. Вы должны проверить, является ли fileIn значением null сразу после его создания, однако, если путь к файлу неверен.

Без цикла while вы просто читаете один объект из потока. Правильно это или нет, я не знаю. Однако, как правило, следует знать, сколько объектов было записано в поток, чтобы можно было прочитать обратное число объектов.

(Вы можете прочитать, пока вы не получите EOFException, однако я бы лично не оправдываю этого. Я хотел бы предложить вам вместо того, чтобы хранить объект-контейнер с несколькими подобъектов. EOFException может быть выброшен по другим причинам чем потому, что последний объект был успешно прочитан. Однако я благодарен вам за то, что вы можете запрограммировать этот способ, чтобы завершить свое задание).

Наконец, вам необходимо убедиться, что входные потоки закрыты, даже если произошло исключение. Если вы используете Java 7, то try-with-resources construct может сделать это проще.

+0

Да, дело в том, что я не могу узнать, сколько объектов я буду помещать в поток, потому что он суперируется, чтобы быть переменным, и иметь возможность создавать файлы epe ... это беспорядок. Спасибо, человек, я попытаюсь это решить. –

+0

Вам не нужно знать, сколько объектов было записано в поток. – EJP

+0

@Afsantos Да, это то, что я думал, но я не знаю, как сообщить программе остановиться после того, как она дойдет до конца файла. Это мой код учителя, и он работает неправильно ... и я все еще ищу решение, любые идеи? –

2

ObjectInputStream.readObject() throws EOFException, когда конец потока достигнут. Ваша петля должна иметь форму while (true) или for (;;), и она должна содержать блок catch (EOFException exc), который вырывается из цикла.

Тестирование while (fileIn != null) полностью бесполезно.

+0

Не уверен, что мне нравится идея «EOFException» контролировать поток программы. Если было написано несколько объектов, я бы рекомендовал их обернуть в контейнер и написать это. Поскольку ObjectOutputStreams не добавляют красиво, если вы добавляете к ним, вы почти всегда будете знать количество объектов, которые должны быть записаны на момент написания. –

+0

@ DuncanJones К сожалению, разработчики API не имели преимуществ от ваших симпатий и антипатий, когда они его писали. Не всегда имеет смысл свергнуть код только для того, чтобы угодить ароматным канонам вкуса, особенно тем, которые установлены независимо от дизайна API. – EJP

+0

Я не уверен, что дизайнеры API предполагали использование потока. JavaDocs для объекта ObjectInputStream не считают это шаблоном. Они даже не указывают ссылку EOFException по имени. В любом случае, похоже, мы не будем соглашаться на этот вопрос, поэтому я вернусь под мостом. –

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