读取没有EOFException的objectfile

时间:2014-07-23 09:45:10

标签: java

请看下面的代码

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检查不足以满足需要。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

while ((hh = (name) oi.readObject()) != null) {

问题出在这里。如果您写了null,readObject()会返回null,否则返回EOFException。读取流末尾的正确测试是捕获{{1}}。

答案 1 :(得分:0)

这里的问题是方法InputStream#readObject没有返回空对象超过EOF它总是抛出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);
    }

希望这有帮助。