【问题标题】:reading objectfile without EOFException [duplicate]读取没有EOFException的对象文件[重复]
【发布时间】:2014-07-23 09:45:10
【问题描述】:

请看下面的代码

public class xina {

    static name[] Name;

    public static void main(String[] args) throws Exception {
        Name = new name[3];
        Name[0] = new name("Hugh", "Jackman");
        Name[1] = new name("John", "TRavolta");
        Name[2] = new name("Megh", "Ryne");

        File ff = new File("object.txt");

        FileOutputStream fo = new FileOutputStream(ff.getName());
        ObjectOutputStream oo = new ObjectOutputStream(fo);

        for (name dd : Name) {
            System.out.println(dd.getfistName() + " " + dd.getlastName());
            oo.writeObject(dd);
        }

        oo.close();

        FileInputStream fi = new FileInputStream(ff.getName());
        ObjectInputStream oi = new ObjectInputStream(fi);

        name hh;
        try {
            while ((hh = (name) oi.readObject()) != null) {
                System.out.println(hh.fistName);
            }
        } catch (EOFException e) {
            System.out.println("file ended");
        }

    }
}

这里的“name”是保存名字和姓氏的类。 我如何在不使用异常的情况下读取文件。 我的观点是它试图在没有更多对象存在时进行读取,看起来 null 检查不足以满足需要。

提前致谢。

【问题讨论】:

  • 您应该改进代码中的命名。

标签: java


【解决方案1】:
while ((hh = (name) oi.readObject()) != null) {

问题就在这里。 readObject() 返回 null 如果你写了一个空值,否则不返回。读取流结束的正确测试是捕获EOFException

【讨论】:

    【解决方案2】:

    这里的问题是,InputStream#readObject 方法不会在 EOF 之后返回 null 对象,它总是会抛出 Exception。对此的简单解决方案是 serializing 先传递数组的大小并先读取大小,然后再读取该大小的数组,而 de-serializing

    所以在写的时候:

    oo.writeObject(new Integer(Name.length));
    
    for (name dd : Name) {
            System.out.println(dd.getfistName() + " " + dd.getlastName());
            oo.writeObject(dd);
    }
    

    阅读时:

    ObjectInputStream oi = new ObjectInputStream(fi);
    
    Integer size = oi.readObject();
    name hh;
        for (int i=0;i<size;i++) {
            hh= (Name) oi.readObject();
            System.out.println(hh.fistName);
        }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 2020-07-22
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多