是否无法附加到ObjectOutputStream
?
我正在尝试附加到对象列表。以下代码片段是每当作业完成时调用的函数。
FileOutputStream fos = new FileOutputStream
(preferences.getAppDataLocation() + "history" , true);
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject( new Stuff(stuff) );
out.close();
但是当我尝试读取它时,我只得到文件中的第一个。
然后我得到java.io.StreamCorruptedException
.
为了阅读我正在使用
FileInputStream fis = new FileInputStream
( preferences.getAppDataLocation() + "history");
ObjectInputStream in = new ObjectInputStream(fis);
try{
while(true)
history.add((Stuff) in.readObject());
}catch( Exception e ) {
System.out.println( e.toString() );
}
我不知道会有多少物体出现,所以我正在阅读,没有例外。根据谷歌的说法,这是不可能的。我想知道是否有人知道方法?
技巧如下:子类ObjectOutputStream
并覆盖writeStreamHeader
method:
public class AppendingObjectOutputStream extends ObjectOutputStream {
public AppendingObjectOutputStream(OutputStream out) throws IOException {
super(out);
}
@Override
protected void writeStreamHeader() throws IOException {
// do not write a header, but reset:
// this line added after another question
// showed a problem with the original
reset();
}
}
要使用它,只需检查历史文件是否存在并实例化此可追加流(如果文件存在=我们追加=我们不需要标头)或原始流(如果文件不存在=我们需要一个标题)。
Edit
我对班级的第一个命名不满意。这个更好:它描述了“它的用途”,而不是“它是如何完成的”
Edit
再次更改名称,以澄清该流仅用于附加到现有文件。它不能用于创建new包含对象数据的文件。
Edit
添加了一个调用reset()
after 这个问题显示刚刚覆盖的原始版本writeStreamHeader
在某些情况下,成为无操作可能会创建无法读取的流。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)