如何重置ObjectInputStream对象图缓存以避免内存膨胀

时间:2013-03-28 06:05:15

标签: java serialization

使用ObjectInputStream加载大型文件时,所有读取对象都由流缓冲,以便对象图解析 这会导致巨大的内存开销,这在我的情况下是不需要的(所有读取的对象都是相互依赖的) 是否有一个等效于ObjectOutputStream的reset()方法来重置这个缓冲区?

代码示例:

try (FileInputStream fileInputStream = new FileInputStream(filename);
         BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
         ObjectInputStream objectInputStream = new ObjectInputStream(bufferedInputStream)) {
  while (object = objectInputStream.readObject()) {
    System.Out.println(object.toString());
  }
}

2 个答案:

答案 0 :(得分:2)

由发件人决定何时通过调用ObjectOutputStream.reset()来破坏已发送对象图的完整性。不是接收者。

请注意您的代码无法编译,如果执行此操作则无效:

while (object = objectInputStream.readObject()) {
}

这应该是

try {
    while (true) {
        object = objectInputStream.readObject();
        // ...
    }
}
catch (EOFException exc) {
    // end of stream
}

国外存在一种误解,readObject()在流的末尾返回null。它没有。它抛出EOFException。每当您撰写null时,它都会返回null

答案 1 :(得分:0)

嗯,似乎你需要使用某种延迟加载技术,你只需要加载对象图的必需组件,而不是所有东西。