java.io.StreamCorruptedException: invalid type code: AC解决办法
【摘要】
.java.io.StreamCorruptedException: invalid type code: AC解决办法
问题描述:
在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了FileOutputStream(文件名,true)间接的构建了ObjectOutputStream流对象,在向外读数据的时候第一次运行的...
问题描述:
在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了FileOutputStream(文件名,true)间接的构建了ObjectOutputStream流对象,在向外读数据的时候第一次运行的时候不会报错,在第二次就会报java.io.StreamCorruptedException: invalid type code: AC错误。
原因:
在一个文件都有一个文件的头部和文件体。由于对多次使用FileOutputStream(文件名,true)构建的ObjectOutputStream对象向同一个文件写数据,在每次些数据的时候他都会向这个文件末尾先写入header在写入你要写的对象数据,在读取的时候遇到这个在文件体中的header就会报错。导致读出时,出现streamcorrput异常。
解决办法:所以这里要判断是不是第一次写文件,若是则写入头部,否则不写入。
代码示例:
1.MyObjectOutputStream.java文件
-
import java.io.*;class MyObjectOutputStream extends ObjectOutputStream {
-
public MyObjectOutputStream() throws IOException {
-
super();
-
}
-
public MyObjectOutputStream(OutputStream out) throws IOException {
-
super(out);
-
}
-
@Override
-
-
protected void writeStreamHeader() throws IOException {
-
return;
-
}
-
}
2.ObjectSave.Java文件
-
import java.io.*;
-
import java.util.*;
-
public class ObjectSave {
-
/** * @param args
-
* * @throws IOException
-
* * @throws IOException
-
* @throws FileNotFoundException
-
* */
-
public static void main(String[] args) {
-
ObjectOutputStream out = null;
-
ObjectInputStream in = null;
-
List<User> list = new ArrayList<User>();
-
list.add(new User("admin", "admin", "123", 1));
-
list.add(new User("zhang", "zhang", "123", 0));
-
String path = "d://abc";
-
try { //判断文件大小并调用不同的方法
-
File file = new File(path);
-
FileOutputStream fos = new FileOutputStream(file, true);
-
if(file.length()<1){
-
out = new ObjectOutputStream(fos);
-
}else{
-
out = new MyObjectOutputStream(fos);
-
}
-
//out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(path,true)));
-
//out.writeObject(Calendar.getInstance());
-
//判断文件大小并调用不同的方法
-
for (int i = 0; i < list.size(); i++) {
-
out.writeObject(list.get(i));
-
}
-
} catch (Exception ex) {
-
ex.printStackTrace();
-
} finally {
-
try {
-
out.close();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
} try {
-
in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(path)));
-
//Calendar date = (Calendar) in.readObject();
-
//System.out.format("On %tA, %<tB %<te, %<tY:%n", date);
-
while (true) {
-
User user = (User) in.readObject();
-
System.out.println(user.getName());
-
}
-
} catch (EOFException e) {
-
-
} catch (Exception ex) {
-
ex.printStackTrace();
-
} finally {
-
try {
-
in.close();
-
} catch (IOException e) {
-
e.printStackTrace(); }
-
}
-
}
-
}
-
}
-
}
-
}
文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。
原文链接:chenyu.blog.csdn.net/article/details/52180459
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)