java.io.StreamCorruptedException: invalid type code: AC解决办法

举报
chenyu 发表于 2021/07/27 01:39:47 2021/07/27
【摘要】 .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文件


   
  1. import java.io.*;class MyObjectOutputStream extends ObjectOutputStream {
  2. public MyObjectOutputStream() throws IOException {
  3. super();
  4. }
  5. public MyObjectOutputStream(OutputStream out) throws IOException {
  6. super(out);
  7. }
  8. @Override
  9. protected void writeStreamHeader() throws IOException {
  10. return;
  11. }
  12. }

2.ObjectSave.Java文件

   
  1. import java.io.*;
  2. import java.util.*;
  3. public class ObjectSave {
  4. /** * @param args
  5. * * @throws IOException
  6. * * @throws IOException
  7. * @throws FileNotFoundException
  8. * */
  9. public static void main(String[] args) {
  10. ObjectOutputStream out = null;
  11. ObjectInputStream in = null;
  12. List<User> list = new ArrayList<User>();
  13. list.add(new User("admin", "admin", "123", 1));
  14. list.add(new User("zhang", "zhang", "123", 0));
  15. String path = "d://abc";
  16. try { //判断文件大小并调用不同的方法
  17. File file = new File(path);
  18. FileOutputStream fos = new FileOutputStream(file, true);
  19. if(file.length()<1){
  20. out = new ObjectOutputStream(fos);
  21. }else{
  22. out = new MyObjectOutputStream(fos);
  23. }
  24. //out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(path,true)));
  25. //out.writeObject(Calendar.getInstance());
  26. //判断文件大小并调用不同的方法
  27. for (int i = 0; i < list.size(); i++) {
  28. out.writeObject(list.get(i));
  29. }
  30. } catch (Exception ex) {
  31. ex.printStackTrace();
  32. } finally {
  33. try {
  34. out.close();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. } try {
  39. in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(path)));
  40. //Calendar date = (Calendar) in.readObject();
  41. //System.out.format("On %tA, %<tB %<te, %<tY:%n", date);
  42. while (true) {
  43. User user = (User) in.readObject();
  44. System.out.println(user.getName());
  45. }
  46. } catch (EOFException e) {
  47. } catch (Exception ex) {
  48. ex.printStackTrace();
  49. } finally {
  50. try {
  51. in.close();
  52. } catch (IOException e) {
  53. e.printStackTrace(); }
  54. }
  55. }
  56. }
  57. }
  58. }
  59. }



文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/52180459

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。