簡體   English   中英

在附加模式下讀取由ObjectOutputStream編寫的目標文件(多次關閉)

[英]Reading an object file written by ObjectOutputStream in append mode (multiple closings)

在過去2周中,我已在同一文件中寫入了多個對象。 每次(大約一百萬次)我都打電話:

try(ObjectOutputStream output=new ObjectOutputStream(new FileOutputStream(new File("somefile"),true))) {            
        output.writeObject(someobject);               
        output.close();
    } 

現在,當我嘗試使用以下方法閱讀它時:

try(ObjectInputStream input=new ObjectInputStream(new FileInputStream(new File("somefile")))) {   
        while(true) {     
            PROCESS_IT(input.readObject());
        }
    }

它僅讀取第一個對象並給出錯誤:

java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1379)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)

我現在知道在編寫這些對象時(應該附加到ObjectOutputStream )我應該重寫流頭。

但是我花了兩個星期的時間才能在“ somefile”中獲得結果。 我可以通過跳過損壞的字節/標頭以某種方式仍然讀取所有對象嗎? 請指教。 謝謝

我尚未(尚未)對其進行測試,但是您應該能夠每次在同一FileInputStream上重新創建ObjectInputStream,並且它將重新讀取標頭。

例如(再次,未經測試):

FileInputStream fis = new FileInputStream("someFile");
while (true) {
  ObjectInputStream input = new ObjectInputStream(fis)
  try {
    PROCESS_IT(input.readObject());
  }
  // Don't close the DataInputStream, it would close the underlying FileInputStream
}

從理論上講,當您創建ObjectInputStream時,它將讀取標頭,然后讀取一個對象,從而使基礎FileInputStream前進。 然后,當您迭代並創建第二個ObjectInputStream時,它不知道基礎FileInputStream已被部分消耗,因此將重新讀取標頭並讀取另一個對象。 等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM