首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 序列化存取 ArrayList:先寫入標準對象流再讀取,避免文件格式不匹配

     編輯:程式設計疑難解答

問題分析

報錯「未經檢查的類型使用」,且 `readObject()` 返回 `Object` 需強轉。根因:**文件 `timetracker.data` 內容不是合法的序列化 `ArrayList` 對象**(可能為空、損壞、或非 Java 序列化格式)。

正確流程:先寫標準文件,再讀

// 1. 先寫入一個標準序列化 ArrayList
public void writeFirst() {
    ArrayList list = new ArrayList<>();
    list.add("hello"); list.add("world");
    try (FileOutputStream fos = new FileOutputStream("timetracker.data");
         ObjectOutputStream oos = new ObjectOutputStream(fos)) {
        oos.writeObject(list); // 寫入對象圖
    } catch (IOException e) { e.printStackTrace(); }
}

// 2. 再讀取驗證
public void readAfter() {
    try (FileInputStream fis = new FileInputStream("timetracker.data");
         ObjectInputStream ois = new ObjectInputStream(fis)) {
        ArrayList list = (ArrayList) ois.readObject();
        System.out.println(list); // [hello, world]
    } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); }
}

關鍵點

  • **同一 JVM 序列化版本**(`serialVersionUID`)讀寫兼容。
  • 文件必須由 `ObjectOutputStream.writeObject()` 產生,不能手工編輯/其他工具生成。
  • 泛型擦除導致編譯警告,運行時需強轉,可用 `@SuppressWarnings("unchecked")` 抑制。
  • 異常分支務必 `e.printStackTrace()` 定位具體原因(EOF、ClassNotFound、StreamCorrupted)。

項目代碼修正建議

  1. 啟動時先檢查文件是否存在、長度>0。
  2. 讀取失敗時捕獲異常,初始化空 `ArrayList` 而非拋出。
  3. 寫入時用 `try-with-resources` 確保流關閉、數據刷盤。

總結

Java 序列化存取 List:**先用 ObjectOutputStream 寫標準文件**,再用 ObjectInputStream 讀並強轉。文件格式不匹配是最常見錯誤,重新生成標準文件即可解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved