java對象流,實現追加的方法!

問題描述: 用類ObjectOutputStream向文件寫讀對象時,碰到一個問題:新建一個文 
  件,用輸出流ObjectOutputStream向文件連續寫幾個對象,關閉輸出流,然 
  後讀取,這些對象都可以讀出;這時在向該文件增加對象,新寫的對象就讀不出了,不知什麼原因?請教了! 
  
  問題出現的原因:ObjectOutputStream建立後第一次寫入一個對象時, 會在對象數據前寫入一些標誌的數據“AC ED 
  00 05”(用ultraEdit打開),應該是流相關的信息。當你關閉 
  ObjectOutputStream後再重新打開往文件裏面寫對象時(append方式),就會再一次把“AC ED 00 
  05”寫入文件,而這些信息並不是你寫入對象的數據,所以當你用ObjectInputStream來讀取對象時,流會將除第一個“AC ED 00 
  05”以外的數據當作各個對象的數據,造成無法解析,所以讀取時有一個java.io.StreamCorruptedException出現。 
  這個可以通過編輯Info.dat來驗證,只要將“AC ED 00 05”刪除(第一個“AC ED 00 05”保留)就可以正常讀出後來加入的對象。 
  給出一個比較笨的解決方法: 在以後要添加新的對象到Info.dat時,將裏面原有的對象讀出放入ArrayList中,清空文件,再將對象集一次寫入。 
  
  嘗試解決辦法: 那個“AC ED 00 05”是 
  ObjectOutputStream.writeSystemHeader()寫進去的,你可以繼承ObjectOutputStream類,覆蓋這個方法。 
  在你自己的writeSystemHeader()裏判斷是不是第一次寫入一個文件,如果是向一個文件大小不爲零的文件追加的話,就調用 
  super.reset(),如果是第一次寫這個文件,不是追加,就調用super.writeSystemHeader() 

自定義類MyObjectOutputStream 
Java代碼  
public class MyObjectOutputStream extends ObjectOutputStream {  
    //定義成靜態的好處  
    private static File f;  
  
    /** 
     * 初始化靜態文件對象,並返回類對象 
     * @param file 文件對象,用於初始化靜態文件對象 
     * @param out 輸出流 
     * @return MyObjectOutputStream 
     * @throws IOException 
     */  
    public static  MyObjectOutputStream newInstance(File file, OutputStream out)  
            throws IOException {  
        f = file;//本方法最重要的地方:構建文件對象,是兩個文件對象屬於同一個  
        return new MyObjectOutputStream(out, f);  
    }  
  
    @Override  
    protected void writeStreamHeader() throws IOException {  
        if (!f.exists() || (f.exists() && f.length() == 0)) {  
            super.writeStreamHeader();  
        } else {  
            super.reset();  
        }  
  
    }  
  
    public MyObjectOutputStream(OutputStream out, File f) throws IOException {  
        super(out);  
    }  
  
}  


測試方法: 
Java代碼  
public static void writeObject() throws Exception {  
        String filename = "test.txt";  
        File f = new File(filename);  
        OutputStream os = new FileOutputStream(f, true);  
        MyObjectOutputStream moos = MyObjectOutputStream.newInstance(f, os);  
        moos.writeObject("abc");  
        moos.writeObject(1);  
        moos.close();  
    }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章