您的位置:首页 > 编程语言 > Java开发

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

2013-03-21 16:18 537 查看
问题描述:

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

protected void writeStreamHeader() throws IOException {
9    return;
10  }
11 }




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
48                         } catch (Exception ex) {
49                             ex.printStackTrace();
50                             } finally {
51                                 try {
52                                     in.close();
53                                     } catch (IOException e) {
54                                         e.printStackTrace();   }
55                                 }
56                     }
57     }
58         }
59     }
60 }


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐