.java.io.StreamCorruptedException: invalid type code: AC 해결 방법

11288 단어
이 문서는 다음에 옮겨집니다.https://www.cnblogs.com/elleniou/archive/2012/08/29/2662353.html저자:elleniou 전재는 이 성명을 명기해 주십시오.
문제 설명:
한 파일에 서열화된 대상을 쓸 때 파일의 끝에 서열화된 대상만 추가하려고 File OutputStream(파일 이름,true)을 사용하여 Object OutputStream 흐름 대상을 간접적으로 구축하여 외부에서 데이터를 읽을 때 첫 번째 운행할 때 틀리지 않고 두 번째에java를 보고합니다.io.StreamCorruptedException: invalid type code: AC 오류.
이유:
하나의 파일에는 하나의 파일의 머리와 파일체가 있다.File Output Stream (파일 이름,true) 을 여러 번 사용해서 만든 Object Output Stream 대상이 같은 파일에 데이터를 쓰기 때문에, 데이터가 있을 때마다 헤더가 쓸 대상 데이터를 먼저 쓰기 때문에, 읽을 때 이 파일체에 있는 헤더를 만나면 오류가 발생합니다.읽을 때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 list = new ArrayList();
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, %
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 }

좋은 웹페이지 즐겨찾기