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

Java 通訊錄項目:TXT 文件讀取後無法查詢的問題分析與解決

     編輯:程式設計疑難解答

問題現象

在課程設計的通訊錄管理系統中,運行時可正常進行增刪改查操作,但將數據保存到本地 TXT 文件後退出程序,再次啟動時讀取文件,卻無法執行查詢操作。

根本原因

程序啟動時,內存中的 ArrayList<Infro> list 為空。查詢功能遍歷的是這個內存列表,而非直接讀取文件。若不在啟動時將文件數據加載到 list 中,查詢自然無結果。

此外,保存功能使用 FileWriter 直接寫入,會覆蓋原文件,若未先加載舊數據,會導致數據丟失。

解決方案

1. 靜態代碼塊初始化加載數據

static {
    loadFromFile();
}

private static void loadFromFile() {
    try (BufferedReader br = new BufferedReader(new FileReader("通訊錄管理.txt"))) {
        String line;
        while ((line = br.readLine()) != null) {
            // 解析 line 並重建 Infro 對象加入 list
            // 格式需與 toString() 輸出一致,建議使用分隔符或 JSON
        }
    } catch (IOException e) {
        // 文件不存在或讀取失敗時忽略,保持 list 為空
    }
}

2. 修正保存邏輯,避免覆蓋

public static void writeFunction() throws IOException {
    // 先將內存數據寫入臨時文件,再替換原文件,保證原子性
    File temp = File.createTempFile("contacts", ".tmp");
    try (FileWriter fw = new FileWriter(temp)) {
        for (Infro info : list) {
            fw.write(info.toString());
            fw.write("\r\n");
        }
    }
    // 替換原文件
    Files.move(temp.toPath(), Paths.get("通訊錄管理.txt"), StandardCopyOption.REPLACE_EXISTING);
}

3. 查詢功能優化建議

  • 使用 List.stream().filter(...) 替換手動循環,代碼更簡潔。
  • 若數據量大,考慮建立索引(如 Map<String, List<Infro>> 按姓名/電話索引)。

完整項目結構建議

將數據訪問邏輯封裝為 ContactDAO 介面,實現類處理文件/數據庫操作,UI 層僅調用業務邏輯,符合分層架構,便於後續擴展至數據庫。

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