java的ObjectOutputStream 如何追加文件

前言

最近在写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()方法的疑问可自行查询,我也不太懂。第一次写博客,如有错误,请海涵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值