连续向文件中写入java对象后,读取报错
2017-04-18 23:49
645 查看
今天遇到个问题,向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.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 将对象写入文件进行保存和读取
- java json总结 读取json文件或者把对象写入到json文件里面
- java 将对象写入到文件中
- 使用Java读取xlxs文件和写入txt文件,并将数据写入到本地文件
- Java中读取配置文件中的信息,并利用配置文件中的信息创建对象
- java===java基础学习(5)---文件读取,写入操作
- java读取数据写入txt文件并将读取txt文件写入另外一个表
- 怎么用java从文件中读取图片和写入图片到文件里
- java当中randomAccessFile文件随机读取对象的简单使用
- Java 创建文件夹和文件,字符串写入文件,读取文件
- Java读取txt文件和写入txt文件
- java 文件的读取与写入(简单操作)
- java 读取本地excel 文件,将excel内容转换成java对象
- java 读取和写入properties文件
- java:经典文件写入和读取,速度超快
- Java file文件的写入和读取及下载
- jsp,java文件操作(新建,删除,读取,写入)(转载)
- Java实现 二进制读取和写入 拷贝文件
- java的I/O操作,读取和写入文件
- Java 通过 BufferReader 实现 文件 写入读取 示例