ObjectOutputStream 附加:具有子类化的解决方案
附加到 ObjectOutputStream 可能是一项有问题的任务。正如您所发现的,ObjectOutputStream 在写入现有文件时的默认行为是覆盖它,从而导致数据丢失。
要解决此问题,关键是重写 ObjectOutputStream 的行为。具体来说,通过重写 writeStreamHeader 方法,我们可以防止在附加到现有文件时写入标头。考虑以下代码示例:
public class AppendingObjectOutputStream extends ObjectOutputStream { public AppendingObjectOutputStream(OutputStream out) throws IOException { super(out); } @Override protected void writeStreamHeader() throws IOException { // Do not write a header reset(); // Added to fix potential issues with previous implementation } }
AppendingObjectOutputStream 子类继承自原始 ObjectOutputStream 类并重写 writeStreamHeader 方法。在这个重写的方法中,我们不写入标头,而是重置流。这有效地允许我们将数据附加到现有文件而不覆盖它。
要使用此技术,您可以检查历史文件是否存在。如果文件存在,则实例化AppendingObjectOutputStream;否则,使用常规的 ObjectOutputStream。以下是使用此方法的代码的更新版本:
OutputStream out; if (historyFile.exists()) { out = new AppendingObjectOutputStream(new FileOutputStream(historyFile, true)); } else { out = new ObjectOutputStream(new FileOutputStream(historyFile)); } out.writeObject(new Stuff(stuff)); out.close();
通过在附加到现有文件时使用 AppendingObjectOutputStream 类,您可以在添加新对象时保留现有数据。此技术允许您创建一个持久数据存储,该数据存储可以根据需要增长,而无需覆盖或数据丢失。
以上是如何附加到现有的 ObjectOutputStream 文件而不覆盖数据?的详细内容。更多信息请关注PHP中文网其他相关文章!