微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

问题描述:

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



版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐