• .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文件

     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 }
  • 相关阅读:
    [Delphi]ListView基本用法大全
    Delphi 数据类型列表
    什么是堆、栈?
    使用钩子函数[1]
    邻道干扰
    内存管理[1]
    c#中复制类提示“Resource”参数不支持重复项的解决办法
    转帖:IE对话框showModalDialog(模态)和showModelessDialog
    今日工作心得:一段用于验证的jQuery代码
    每个开发人员现在应该下载的十种必备工具
  • 原文地址:https://www.cnblogs.com/elleniou/p/2662353.html
Copyright © 2020-2023  润新知