当使用ObjectInputStream加载大文件时,所有读取的对象都被stream缓冲用于对象图解析。
这会导致巨大的内存开销,这在我的情况下是不需要的(所有读取的对象都是相互依赖的)。
是否有一个相当于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());
}
}
- 类中实际上有一个reset方法,但它做的是完全不同的事情。
- 查看导致内存膨胀的Java api
调用ObjectOutputStream.reset()
,由发送方决定何时破坏发送对象图的完整性。不是收件人。
注意:你的代码不能编译,如果编译成功了也不会有效:
while (object = objectInputStream.readObject()) {
}
应该是
try {
while (true) {
object = objectInputStream.readObject();
// ...
}
}
catch (EOFException exc) {
// end of stream
}
国外有一种误解,认为readObject()
在流的末端返回null
。它不是。它抛出EOFException
。它可以在您编写null
时返回null
。
看来你需要使用某种延迟加载技术,只加载对象图的必要组件,而不是所有组件。