程序使用ObjectOutputStream(new FileOutputStream(fileName,true))向文件尾写入多个对象,多次运行,最后进行读取的时候抛出StreamCorruptedException

jdk1.8源码

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();                     //向文件写入header信息
bout.setBlockDataMode(true);
if (extendedDebugInfo) {
debugInfoStack = new DebugTraceInfoStack();
} else {
debugInfoStack = null;
}
}

ObjectOutputStream构造方法会调用writeStreamHeader()向文件写入header信息 ,多次创建ObjectOutputStream对象向同个文件writeObject时会多次写入header信息,这使得readObject()时不能持续读取到存入的对象,抛出StreamCorruptedException。

直接重写writeStreamHeader()使其不写入任何内容即可

代码如下

class MyObjectOutputStream extends ObjectOutputStream { 

public MyObjectOutputStream() throws IOException {
super();
}
public MyObjectOutputStream(OutputStream out) throws IOException {
super(out);
}
@Override

protected void writeStreamHeader() throws IOException {     //重写该方法
return;
}
}

记得第一次向文件writeObject()时,要使用ObjectOutputStream对象,因为第一次一定要写入Header信息,代码如下:

if (file.length() < 1) {      //若文件不存在或文件为空使用ObjectOutputStream写入对象
oos = new ObjectOutputStream(new FileOutputStream(file, true));
} else {          //文件不为空则用MyObjectOutputStream写入对象
oos = new MyObjectOutputStream(new FileOutputStream(file, true));
}
时间: 2024-10-01 05:42:09

程序使用ObjectOutputStream(new FileOutputStream(fileName,true))向文件尾写入多个对象,多次运行,最后进行读取的时候抛出StreamCorruptedException的相关文章

C# 程序自动批量生成 google maps 的KML文件

原文:C# 程序自动批量生成 google maps 的KML文件 google maps 的 KML 文件可以用于静态的地图标注,在某些应用中,我们手上往往有成百上千个地址,我们需要把这些地址和描述批量标注到 google maps 上去,如果手工来做,太耗时间,在这里我写了一个程序批量来生成这个 KML 文件. 首先看一下 KML 文件的格式: <?xml version="1.0" encoding="UTF-8"?> <kml xmlns=

小程序1:输入一个文件名,检测是否存在;如果不存在创建文件并写入内容

实现内容:输入一个文件名,检测是否存在:如果不存在创建文件并写入内容代码实现如下: 注意事项: 1.python os.path模块中  os.path.exists(path)  #路径存在则返回True,路径损坏返回False:::所以输入应该是“路径”,不是随意一个文件夹 2.IOError: [Errno 22] invalid mode ('r') or filename 这种错误的出现是在使用built-in函数file()或者open()的时候:因为文件的打开模式不对或文件名有问题

分享非常有用的Java程序 (关键代码) (三)---创建ZIP和JAR文件

原文:分享非常有用的Java程序 (关键代码) (三)---创建ZIP和JAR文件 import java.util.zip.*; import java.io.*; public class ZipIt { public static void main(String args[]) throws IOException { if (args.length < 2) { System.err.println("usage: java ZipIt Zip.zip file1 file2 f

【Python】按行读取文件、IOError: [Errno 22] invalid mode (&#39;a+&#39;) or filename,处理文件的换行符

Python一次性读取文件的所有内容在<[Python]文件读写操作>(点击打开链接)中已经说明过的,但有些时候,需要对文件中的每一行进行处理. 比如有一个f:\1.txt如下: 此时,如果要按行读取这个文件,可以直接利用Pyhon的for循环来读取,其中for的对象是这个文件指针,代码如下: file_path="f:\\a.txt" fp=open(file_path,"a+"); for eachline in fp: print eachline

如何防止后台线程抛出的异常让程序崩溃退出

原文:如何防止后台线程抛出的异常让程序崩溃退出 如果你的程序抛了异常,你是怎么处理的呢?等待程序崩溃退出?还是进行补救? 如果是做 UI 开发,很容易就找到 Dispatcher.UnhandledException 事件,然后在事件中进行补救.如果补救成功,可以设置 e.Handled = true 来阻止异常继续让程序崩溃退出.但是,如果是后台线程抛出了异常呢?并没有 Dispatcher 可以用.所以我们就束手就擒让程序自己退出吗? WPF 和 Windows Forms 都是微软的框架,

程序员的自我修养:(1)目标文件

程序员的自我修养:(1)目标文件 1.目标文件 1.1 编译与链接 在使用像Visual Studio或Qt Creator等IDE时,通常有一个叫做"构建"的按钮.当编辑完成要运行和测试时点一下它,程序就能跑起来了,所以我们很少关心编译和链接.其实,编译和链接合并在一起就称为 构建(Build).简单的一次按键,实际背后却是异常复杂的过程: 预编译(Preprocessing) 编译(Compilation) 扫描:算法类似有限状态机(FSM),将字符转换成Token. 语法分析:分

黑马程序员——————&gt; 异常处理之抛出

------- android培训.java培训.期待与您交流! ---------- java的异常被分类为两大类,Checked异常和Runtime异常(运行时异常).所有的RuntimeException类及其子类的实例被称为Runtime异常:不是RuntimeException类及其子类的异常实例则被称为Checked异常. 对于Checked异常的处理方式有如下两种. 1:当前方法明确知道如何处理该异常,程序应该使用try...catch块来捕获该异常,然后在对应的catch块中修复

正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码

当我在窗体初始化的时候,调用了一个外部的dll,它就不知什么原因的 抛出一个“正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码”的异常,程序就卡掉了,在网上查了查,相关说明如下: .NET2.0中增加了42种非常强大的调试助手,MDA.Loaderlock 是其中之一.Loaderlock检测在一个拥有操作系统loader lock的线程上运行托管代码的情况.这样做有可能会引起死锁,并且有可能在操作系统加载器初始化DLL前被使用. 大致理解:就

5.29日 自己程序的编写,目的:生成xml文件

1.创建了XMLModel这个类:本来还有个rebuildformXML的方法,但是现在用不到,以后再说. public interface XmlModel { public void initModel(); public void doSaveXML(); } 2.对AbstractModel这个类进行了修改,最终变为: package hellogef.model; import java.beans.PropertyChangeListener; import java.beans.P