問題描述:
在向一個文件寫入可序列化對象時,每次只想向文件的末尾添加一個可序列化的對象,於是使用了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);
}
}
}