實現一個基於文件存儲的圖書管理控制台程式,功能:
數據文件:res/Book.txt,每行格式 編號#書名#作者#。
public class Menu {
private static final int MIN = 1, MAX = 3;
private Scanner scanner = new Scanner(System.in);
public void showMain() {
System.out.println("=== 圖書管理系統 ===");
System.out.println("1. 顯示所有圖書");
System.out.println("2. 新增圖書");
System.out.println("3. 查找圖書");
System.out.println("====================");
}
public void showFind() {
System.out.println("1. 按編號查找");
System.out.println("2. 按書名查找");
System.out.println("3. 按作者查找");
}
public int readChoice(int min, int max) {
while (true) {
System.out.print("請輸入選項[" + min + "-" + max + "]:");
try {
int n = Integer.parseInt(scanner.nextLine().trim());
if (n >= min && n <= max) return n;
} catch (NumberFormatException ignored) {}
System.out.println("輸入無效,請重新輸入。");
}
}
}
public class Book {
private static final String FILE_PATH = "res/Book.txt";
private Menu menu = new Menu();
private Scanner scanner = new Scanner(System.in);
// 顯示所有
public void listAll() {
try (Scanner in = new Scanner(new File(FILE_PATH))) {
System.out.println("--- 所有圖書 ---");
while (in.hasNextLine()) {
String[] b = in.nextLine().trim().split("#");
if (b.length >= 3) System.out.printf("編號:%s 書名:%s 作者:%s%n", b[0], b[1], b[2]);
}
} catch (FileNotFoundException e) {
System.out.println("數據文件不存在,將自動創建。");
}
}
// 新增(檢查編號唯一)
public void add() {
System.out.print("請輸入編號:");
String id = scanner.nextLine().trim();
if (existsByField(id, 0)) {
System.out.println("錯誤:編號已存在!");
return;
}
System.out.print("請輸入書名:");
String name = scanner.nextLine().trim();
System.out.print("請輸入作者:");
String author = scanner.nextLine().trim();
String line = id + "#" + name + "#" + author + "#\n";
try (FileOutputStream fos = new FileOutputStream(FILE_PATH, true)) {
fos.write(line.getBytes(StandardCharsets.UTF_8));
System.out.println("新增成功!");
} catch (IOException e) {
System.err.println("寫入失敗:" + e.getMessage());
}
}
// 查找入口
public void find() {
menu.showFind();
int type = menu.readChoice(1, 3);
System.out.print("請輸入查找關鍵字:");
String kw = scanner.nextLine().trim();
int fieldIdx = type - 1; // 0=id, 1=name, 2=author
boolean found = false;
try (Scanner in = new Scanner(new File(FILE_PATH))) {
while (in.hasNextLine()) {
String[] b = in.nextLine().trim().split("#");
if (b.length > fieldIdx && b[fieldIdx].equals(kw)) {
System.out.printf("找到:編號:%s 書名:%s 作者:%s%n", b[0], b[1], b[2]);
found = true;
}
}
} catch (FileNotFoundException e) {
System.out.println("數據文件不存在。");
}
if (!found) System.out.println("未找到匹配記錄。");
}
// 輔助:檢查某欄位值是否存在
private boolean existsByField(String val, int fieldIdx) {
try (Scanner in = new Scanner(new File(FILE_PATH))) {
while (in.hasNextLine()) {
String[] b = in.nextLine().trim().split("#");
if (b.length > fieldIdx && b[fieldIdx].equals(val)) return true;
}
} catch (FileNotFoundException ignored) {}
return false;
}
}
public class LibraryApp {
public static void main(String[] args) {
Book book = new Book();
Menu menu = new Menu();
while (true) {
menu.showMain();
int choice = menu.readChoice(1, 3);
switch (choice) {
case 1: book.listAll(); break;
case 2: book.add(); break;
case 3: book.find(); break;
}
System.out.println(); // 空行分隔
}
}
}
=== 圖書管理系統 === 1. 顯示所有圖書 2. 新增圖書 3. 查找圖書 ==================== 請輸入選項[1-3]:2 請輸入編號:B001 請輸入書名:Java 核心技術 請輸入作者:Cay Horstmann 新增成功! 請輸入選項[1-3]:1 --- 所有圖書 --- 編號:B001 書名:Java 核心技術 作者:Cay Horstmann 請輸入選項[1-3]:3 1. 按編號查找 2. 按書名查找 3. 按作者查找 請輸入選項[1-3]:2 請輸入查找關鍵字:Java 核心技術 找到:編號:B001 書名:Java 核心技術 作者:Cay Horstmann
RandomAccessFile 或 SQLite 支援修改/刪除、高效查詢。try-with-resources 統一資源關閉(已在代碼中體現)。Book 核心邏輯。此專案雖簡陋,但完整演示了分層思想(UI/業務/數據)、異常處理、文件 IO、輸入校驗等 Java 基礎核心技能,適合入門者動手重寫、逐步重構。