使用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());
}
}
答案 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)
嗯,似乎你需要使用某种延迟加载技术,你只需要加载对象图的必需组件,而不是所有东西。