连续向文件中写入java对象后,读取报错
来源:互联网 发布:淘宝店铺免费一键复制 编辑:程序博客网 时间:2024/05/20 05:06
今天遇到个问题,向dat文件中写入java对象,关闭文件,下次再打开文件,继续写入对象,读取时就会报错。
读取第二个对象时报错:
java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1377)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at com.chennei.test.ReadObjectTest.read(ReadObjectTest.java:90)
at com.chennei.test.ReadObjectTest.main(ReadObjectTest.java:20)
这是因为ObjectOutputStream写文件时会追加一个文件头,第二次再追加对象时依然会加入文件头。读取时,读到文件头部分就会报错。
解决办法:可以自己继承一个ObjectOutputStream然后覆写writeStreamHeader()方法,然后什么也不干,该方法就是用来写文件头的。
public class AddObjectOutPutStream extends ObjectOutputStream {
protected AddObjectOutPutStream() throws IOException, SecurityException {
super();
}
protected AddObjectOutPutStream(OutputStream out) throws IOException, SecurityException {
super(out);
}
@Override
protected void writeStreamHeader() throws IOException {
//do nothing
}
}
写文件时,判断是不是第一次写,如果是,用默认的objectoutputstream写,不然用自己定义的AddObjectOutPutStream写,代码
FileOutputStream fos = null;
ObjectOutputStream os = null;
try {
File file = new File();
if (!file.exists())
{
file.createNewFile();
}
fos = new FileOutputStream(file, true);
if (file.length() > 0)
{
os = new AddObjectOutPutStream(fos);
} else
{
os = new ObjectOutputStream(fos);
}
List<Apple> list = createApple();
os.writeObject(list);
os.flush();
} catch (Exception e) {
e.printStackTrace();
} finally
{
try {
os.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
- 连续向文件中写入java对象后,读取报错
- eclipse 向HDFS中写入文件报错 Permission denied
- C#读取EXCEL 文件同时向文件中写入数据和Excel的Range对象
- JAVA中创建ZIP文件,并向ZIP文件中写入并读取条目和数据
- java创建文件,并向文件中写入字符串,读取字符串到屏幕
- Java基础:向txt文档中追加写入多个对象,并读取
- Java基础:向txt文档中追加写入多个对象,并读取
- 读取文件内容和向文件中写入内容
- Java向Properties文件中写入内容
- Java向Properties文件中写入内容
- Java向自定义文件夹中写入文件
- Java向自定义文件夹中写入文件
- 向文件中写入和读取属性(Property)信息
- JAVA读取模板,向Linux服务器写入html文件
- java读取文件后修改,并写入到另一个文件
- java文件读取、写入
- Java中正确使用RandomAccessFile向文件中写入中文
- 向mysql数据库中写入中文,报错问题解决
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
- 逻辑卷管理
- Vue项目源码分析系列一
- junit能否启动web项目设置的web listener?
- Condition-线程通信更高效的方式
- 连续向文件中写入java对象后,读取报错
- 架构真经 | 缓存为王
- 设计模式——工厂模式
- 跟我学JavaScript--作用域,局部变量,全局变量,变量生命周期
- 进程命令
- Node.js模块机制
- Android之路——重启说明
- 微信小程序横向左右滑动案例
- 熄灯之后的学习——再读《MySQL必知必会》(5)|| 过滤数据