我從檔案中讀取物件時遇到問題。當我試圖從 .dat 檔案中讀取物件時,它只列印第一個物件。然后會出現錯誤資訊'java.io.StreamCorruptedException: invalid type code: AC'。我的代碼有什么問題?我試圖找到一個沒有成功的解決方案。每個物件都單獨保存到檔案中(我的 GUI 中有保存按鈕)。
我的物件保存方法哪個引數是物件:
public static void saveObject(GymDiary object){
try (ObjectOutputStream dataOut = new ObjectOutputStream(new FileOutputStream("objectFile.dat", true))){
dataOut.writeObject(object);
dataOut.flush();
dataOut.close();
System.out.println("saving succeeded!");
} catch (IOException e) {
e.printStackTrace();
}
}
我的物件讀取方法:
public static void readObjects() throws IOException {
ArrayList<gymDiary> objectList = new ArrayList<>();
boolean endOfFile= true;
int x = 0;
try (ObjectInputStream objectFile = new ObjectInputStream(new FileInputStream("objectFile.dat"))) {
while (endOfFile) {
gymDiary object = null;
try {
object = (GymDiary) objectFile.readObject();
objectList.add(object);
} catch (ClassNotFoundException e){
e.printStackTrace();
}
if (object != null) {
System.out.println(objectList.get(x).getLoad());
x ;
} else {
endOfFile= false;
objectFile.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
錯誤加入行:object = (GymDiary) objectFile.readObject();
我保存物件的方法有問題嗎?還是我的保存方法有問題?或兩者?:D
我的目標是列印我檔案中的所有物件。不僅是第一。
.dat 檔案看起來像這樣,帶有 2 個物件(我的母語中的一些東西,不要介意):
?í sr *com.example.work.gymDiary?Qj$b8? L kuormatt Ljava/util/ArrayList;L
liikeNimetq ~ L toistotq ~ L treeninNimit Ljava/lang/String;xpsr java.util.ArrayListxò??a I sizexp w sr java.lang.Double€3?J)k? D valuexr java.lang.Number???”à? xp@I sq ~ @I sq ~ @I xsq ~ w t squatxsq ~ w sr java.lang.Integera ¤÷?8 I valuexq ~ q ~ q ~ xt legday?í sr *com.example.work.gymDiary?Qj$b8? L kuormatt Ljava/util/ArrayList;L
liikeNimetq ~ L toistotq ~ L treeninNimit Ljava/lang/String;xpsr java.util.ArrayListxò??a I sizexp w sr java.lang.Double€3?J)k? D valuexr java.lang.Number???”à? xp@I sq ~ @I sq ~ @I xsq ~ w t
benchpressxsq ~ w sr java.lang.Integera ¤÷?8 I valuexq ~ q ~ q ~ xt upperbodyday
uj5u.com熱心網友回復:
這里的問題很可能是您的序列化和反序列化方法的行為不同。您的序列化代碼總是創建一個新的ObjectOutputStream,然后將資料附加到檔案中。這將每次寫入流標頭(魔術和版本)。但是,您的反序列化方法只創建ObjectInputStream一次,因此也只使用一次流標頭。因此,您要么必須:
- 使用單個
ObjectOutputStream寫入所有物件 - 或使用單獨的 new
ObjectInputStream讀取每個物件
此外,您檢測檔案結尾的邏輯可能存在缺陷(除非您省略了代碼)。當流中沒有其他物件時,readObject()拋出例外(當前EOFException,但檔案不保證此特定例外)。因此,您應該明確呼叫writeObject(null); 然后您可以檢測何時readObject()回傳null并考慮資料的結束。
考慮 Java 序列化的替代方案也可能很好,因為它在某些情況下效率不高,而且對于不受信任的資料,它可能非常危險,在最壞的情況下會導致遠程代碼執行(對此的保護是冗長和錯誤的-易于)。另請參閱Java SE 的安全編碼指南。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441138.html
