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

来源:互联网 发布:多表查询sql语句 编辑:程序博客网 时间:2024/05/27 14:13
问题描述:

在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了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();   }                                  }                      }     }          }     } }


 

原创粉丝点击