在課程設計的通訊錄管理系統中,運行時可正常進行增刪改查操作,但將數據保存到本地 TXT 文件後退出程序,再次啟動時讀取文件,卻無法執行查詢操作。
程序啟動時,內存中的 ArrayList<Infro> list 為空。查詢功能遍歷的是這個內存列表,而非直接讀取文件。若不在啟動時將文件數據加載到 list 中,查詢自然無結果。
此外,保存功能使用 FileWriter 直接寫入,會覆蓋原文件,若未先加載舊數據,會導致數據丟失。
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 為空
}
}
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);
}
List.stream().filter(...) 替換手動循環,代碼更簡潔。將數據訪問邏輯封裝為 ContactDAO 介面,實現類處理文件/數據庫操作,UI 層僅調用業務邏輯,符合分層架構,便於後續擴展至數據庫。