【问题标题】:Trying to read a serialized file尝试读取序列化文件
【发布时间】:2015-07-05 07:46:41
【问题描述】:

我一直在尝试读取此文件并将每个对象添加到 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;
}

【问题讨论】:

  • 摆脱多余的f.exists() 测试,在你的空catch 块中添加一些有用的东西。然后你就会知道出了什么问题。
  • 因为你遇到了异常,把e.printStackTrace()放到catch块里面看看有什么抓到。

标签: java file arraylist deserialization


【解决方案1】:

只有当异常发生时,while 循环才会退出。最好用布尔值控制循环,然后通过将布尔值设置为 false 来捕获 EOFException 以退出循环。比如:

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;
    }
}

【讨论】:

  • 什么是正确的布尔语句放在 while 循环中
【解决方案2】:

永远不要吞下异常,否则你将不知道哪里出了问题

改成

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

【讨论】:

  • 异常是:java.io.StreamCorruptedException: invalid stream header: 79737200。你是什么意思?
  • 从对象流中读取的控制信息违反内部一致性检查时抛出。也许检查你创建文件的代码
  • if (f.exists()) { FileOutputStream fos = new FileOutputStream(f, true); NotificacionH.AppendableObjectOutputStream oos = new NotificacionH.AppendableObjectOutputStream(fos); oos.writeObject(new Notificacion(id, diasLaborados, deducciones, fecha)); return true;
  • @Manuel 再次在这里进行毫无意义的f.exists() 测试。事实上它比这更糟糕,因为它会阻止你首先创建文件。不要写这样的代码。当然很明显new FileInputStream() 必须自己检查文件是否存在,以及它的可读性等,而new FileOutputStream() 必须同样检查创建文件的能力?
【解决方案3】:

您最有可能在尝试读取文件时遇到异常,并且因为您没有对异常执行任何操作,所以您不知道发生了什么。至少,将异常的内容打印到控制台看看:

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

因此,再次查看异常并从那里开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多