从文件中了解可序列化的对象数量

时间:2017-02-05 14:40:48

标签: java object serializable

我正在使用Serializable:

从文件中读取对象
    public ArrayList<Object> deserialzePerson(String filename) {
    Object obj = null;
    ObjectInputStream ois;
    try {
        ois = new ObjectInputStream(new FileInputStream(filename));
        for (int i = 0; i < 100; i++) {
            obj = (Object) ois.readObject();
            ObjectArray.add(obj);
        }
    } catch (Exception e) {
    }
    return ObjectArray;
}

但是,我不知道文件中的对象数量,并在for循环中使用数字“100”。如果小于100,则异常将启动并且一切都按预期进行。不过,我发现这个解决方案很差,因为它取决于捕获错误。有没有办法为文件中的对象数量设置for循环的限制?

例如,当从.txt文件中读取时,我使用.hasNext();对象是否有这样的东西?

4 个答案:

答案 0 :(得分:4)

public void serializePerson(String filename, List<Person> persons) {
    try (FileOutputStream fos = new FileOutputStream(filename);
         ObjectOutputStream ous = new ObjectOutputStream(fos)) {

        ous.writeInt(persons.size());
        for (Person person : persons) {
            ous.writeObject(person);
        }
    } catch (Exception e) {
    }
}

public List<Person> deserializePerson(String filename) {
    List<Person> result = new ArrayList<>();
    try (FileInputStream fis = new FileInputStream(filename);
         ObjectInputStream ois = new ObjectInputStream(fis)) {
        int size = ois.readInt();
        for (int i = 0; i < size; i++) {
            Person person = (Person) ois.readObject();
            result.add(person);
        }
    } catch (Exception e) {
    }
    return result;
}

答案 1 :(得分:1)

但是,我不知道文件中的对象数量并使用数字&#34; 100&#34;在for-loop中 读取对象的for循环的最佳替代是

try {
    int currentCounter = 0; 
    ois = new ObjectInputStream(new FileInputStream(filename));
    for (Object obj = null; (obj = ois.readObject()) != null ; currentCounter++) 
    {
        ObjectArray.add(obj);
        // currentCounter is the way out in this case, but I can give more explanations
    }
} catch (Exception e) 
 {
    if( e instanceof EOFException )
    {
        System.err.println( e.getClass() + "=" + e.getMessage() );
    }
    else
    {
        System.err.println( "UNKNOWN INSTANCE: " + e.getClass() + "=" + e.getMessage() );
    }
 }

使用一堆事件监听器机制,您甚至可以做得更好。问题在于,在计划文件读取之前,是否需要有关对象数量计数的前置或后置知识

答案 2 :(得分:1)

您可以编写大小或更简单的解决方案是编写List也是一个对象。

public static void save(String filename, Object o) {
    try (FileOutputStream fos = new FileOutputStream(filename);
         ObjectOutputStream ous = new ObjectOutputStream(fos)) {
        ous.writeObject(o);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

public static <T> T load(String filename) {
    try (FileInputStream fis = new FileInputStream(filename);
         ObjectInputStream ois = new ObjectInputStream(fis)) {
        return (T) ois.readObject();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

e.g。

List<Person> people = load("people.dat");
people.add(new Person());
save("people.dat", people);

这允许您使用较少的代码编写对象或任何类型。

答案 3 :(得分:0)

短版 - 你不能。如果您将对象的数量作为int(或long)写入第一个位置的流中,则可以使用长版本,然后先读取它。

你也可以依赖EOFException,如果没有任何对象,它将被抛出