前言
最近在写java课程作业时,遇到了如何向文件追加对象的问题,按着老师给的方法走不通,自己找了半天才解决,现在写下来记录一下
问题
ObjectOutputStream的构造方法
public ObjectOutputStream(OutputStream out) throws IOException {
verifySubclass();
bout = new BlockDataOutputStream(out);
handles = new HandleTable(10, (float) 3.00);
subs = new ReplaceTable(10, (float) 3.00);
enableOverride = false;
writeStreamHeader();//每构造一次写入一个StreamHeader
bout.setBlockDataMode(true);
if (extendedDebugInfo) {
debugInfoStack = new DebugTraceInfoStack();
} else {
debugInfoStack = null;
}
}
ObjectInputStream的构造方法
public ObjectInputStream(InputStream in) throws IOException {
verifySubclass();
bin = new BlockDataInputStream(in);
handles = new HandleTable(10);
vlist = new ValidationList();
enableOverride = false;
readStreamHeader();//每构造一次读一个StreamHeader
bin.setBlockDataMode(true);
}
我们每构造一个ObjectOutputStream或ObjectInputStream的对象时都会向文件写或读一次StreamHeader.要是直接覆盖文件的话,这不会有什么问题了。但要是想要向文件追加内容的话,可能会多次构造前者来将新内容写入文件,也就是说多次调用到writeStreamHeader()方法。却往往会仅构造一次后者,读一次StreamHeader后,就将文件全部读取。这时文件中还有着多出来的StreamHeader,它们会影响到目标信息的读取,导致读取失败。
方法
要想解决这个问题,就要想办法让目标信息的读取顺利进行
1.可以new一个新类,继承ObjectOutputStream类,再重写构造方法和writeStreamHeader()方法,使得每次构造这个新类的对象时,会检测文件是否为空,如果为空,则写入StreamHeader,反之则不写入(老师给的方法,我手笨,怎么都运行不通)。
2.也可以new两个新类,分别继承ObjectOutputStream和ObjectInputStream类,直接重写构造方法,writerStreamHeader()方法和readStreamHeader()方法,直接一个StreamHeader都不写入。
public class AppendObjectInputStream extends ObjectInputStream {
public AppendObjectInputStream(FileInputStream in) throws IOException {
super(in);//调用父类ObjectInputStream的构造方法,但使用的是子类重写的readStreamHeader()方法
}
//空操作
protected void readStreamHeader() {
}
}
public class AppendObjectOutputStream extends ObjectOutputStream {
public AppendObjectOutputStream(FileOutputStream os) throws IOException {
super(os);
}
protected void writeStreamHeader() throws IOException {
super.reset(); //reset()方法用于重置此流。它将流重置到最近标记的位置
}
}
收尾
浅谈java继承机制——通过super调用父类方法
https://blog.csdn.net/weixin_43905219/article/details/102981618?spm=1001.2014.3001.5506
有关super()方法的疑问可自行查询,我也不太懂。第一次写博客,如有错误,请海涵。