java.io.StreamCorruptedException: invalid type code: AC錯誤的解決方法


問題描述:

在向一個文件寫入可序列化對象時,每次只想向文件的末尾添加一個可序列化的對象,於是使用了FileOutputStream(文件名,true)間接的構建了ObjectOutputStream流對象,在向外讀數據的時候第一次運行的時候不會報錯,在第二次就會報java.io.StreamCorruptedException: invalid type code: AC錯誤。

原因:

在一個文件都有一個文件的頭部和文件體。由於對多次使用FileOutputStream(文件名,true)構建的ObjectOutputStream對象向同一個文件寫數據,在每次些數據的時候他都會向這個文件末尾先寫入header在寫入你要寫的對象數據,在讀取的時候遇到這個在文件體中的header就會報錯。導致讀出時,出現streamcorrput異常(流中的控制信息不一致)。
只有續寫會先寫入header,不是續寫的話,寫入多個對象也只會寫入一次文件頭,在一次續寫時即使寫入多個對象,也只會寫入一次文件頭

知識儲備:
每個文件都有文件的頭部和文件體兩部分
在對象輸出流(ObjectOutputStream)中有Protected方法writeStreamHeader():void,這個方法是專門來寫文件的頭部了。

解決辦法:所以這里要判斷是不是第一次寫文件,若是則寫入頭部,否則不寫入。

代碼示例:

import java.io.*
public class MyObjectOutputStream extends ObjectOutputStream{
    public MyFileOutputStream(){
        super();
    }
    public MyFileOutputStream(OutputStream o){
        super(o);
}
    public void writeStreamHeader(){}//這里覆寫父類中的方法,使他調用writeObject()的時候不寫入文件頭
}

class Demo{
    public static void main(String[] args){
        File file=new File(xxxxxxx);
        ObjectOutputStream out;
        //判斷文件是否存在,以決定要使用哪個objectoutputstream
        if(file.isFile()){
        out=new MyObjectOutputStream(xxxx);
}
            else{
                out=new ObjectOutputStream(xxxxx);
}
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM