2015-04-27 3 views
-1

Я пытался прочитать этот файл и добавить каждый объект в ArrayList. Проблема в том, что он никогда не входит в цикл while.Попытка прочитать сериализованный файл

Вы, ребята, знаете, в чем проблема? И могу ли я улучшить синтаксис кода?

public ArrayList<Notificacion> obtenerListaNovedades() { 
    ObjectInputStream ois = null; 
    try { 
     if (f.exists()) { 
      FileInputStream fis = new FileInputStream(f); 
      ois = new ObjectInputStream(fis); 
      while (true) { 
       Notificacion notificacion = (Notificacion) ois.readObject();      
       listaNotificaciones.add(notificacion);   
      } 
     } else { 
      System.out.println("hay algo ene l archi"); 
     }   
    } catch (Exception e) { 

    } 
    return listaNotificaciones; 
} 
+1

Избавиться от избыточного 'f.exists()' test и поместить что-то полезное в ваш пустой блок 'catch'. Тогда вы поймете, что пошло не так. – EJP

+0

Это потому, что у вас есть исключение, поместите 'e.printStackTrace()' внутри блока catch и посмотрите, что поймали. – CDT

ответ

2

Этот цикл while будет завершен только в случае возникновения исключения. Было бы лучше контролировать цикл с булевым, а затем поймать EOFException, чтобы выйти из цикла, установив boolean в false. Кое-что вроде:

boolean hasObjects = true; 

while (hasObjects) { 
    String notificacion = null; 
    if (ois != null) { 
     try { 
      notificacion = (Notificacion) ois.readObject(); 
      listaNotificaciones.add(notificacion); 
     } catch (EOFException e) { 
      hasObjects = false; 
     } catch (ClassNotFoundException | IOException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     hasObjects = false; 
    } 
} 
+0

Что было бы правильным булевым выражением, чтобы положить внутри цикла while – Manuel

+0

Спасибо за помощь. Оно работает! – Manuel

1

не только проглотить исключения, в противном случае вы не будете знать, что происходит не так

изменение

catch (Exception e) { 
    e.printStackTrace(); 
} 
+0

Исключение: java.io.StreamCorruptedException: недопустимый заголовок потока: 79737200. Вы это понимаете? – Manuel

+0

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

+0

'if (f.exists()) { FileOutputStream fos = new FileOutputStream (f, true); NotificacionH.AppendableObjectOutputStream oos = new NotificacionH.AppendableObjectOutputStream (fos); oos.writeObject (новый Notificacion (id, diasLaborados, deducciones, fecha)); return true; ' – Manuel

0

Ваш скорее всего получаю исключение при попытке чтения файла и потому, что ваш не делая ничего с исключением, вы не знаете, что происходит. По крайней мере, распечатать содержимое исключения на консоль и посмотреть:

e.printStackTrace(); 
e.getMessage(); 

Итак, опять же, посмотрите на исключения и идти оттуда.

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