2013-03-28 66 views
0

當使用ObjectInputStream加載大文件時,所有讀取的對象都通過流進行緩存以便進行對象圖解析。
這會導致巨大的內存開銷,在我的情況下不需要(讀取的所有對象都是相互依賴的)。
是否有一個相當於ObjectOutputStream的reset()方法來重置此緩衝區?如何重置ObjectInputStream對象圖緩存以避免內存膨脹

代碼示例:

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

你能告訴我們你的代碼嗎? – Raptor 2013-03-28 06:06:54

回答

2

由發件人通過調用ObjectOutputStream.reset()來決定何時打破發送的對象圖的完整性。不是接收器。

NB你的代碼不能編譯,如果它確實不會是有效的:

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

這應該是

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

有國外的一個誤解,認爲readObject()回報null月底的流。它沒有。它拋出EOFException。只要你寫了null,它可以返回null

+1

所以這意味着你不應該使用ObjectInputStream.reset()? – 2013-04-30 05:10:38

+0

@MarkY。 ObjectInputStream.reset()從['InputStream.reset()'](https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html#reset--)繼承。 ,除了拋出'IOException'外什麼都不做,所以你當然不應該使用它。 – EJP 2016-07-18 04:45:45

0

嗯,看來你需要使用某種延遲加載技術,其中的對象圖,不是萬能的,你只加載necessairy組件。