首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 簡易圖書管理系統:文件存儲 + 控制台交互完整實現

     編輯:Java 綜合教學

專案目標

實現一個基於文件存儲的圖書管理控制台程式,功能:

  1. 顯示所有圖書
  2. 新增圖書(編號唯一性校驗)
  3. 按編號/書名/作者查找

數據文件:res/Book.txt,每行格式 編號#書名#作者#。

核心類設計

1. Menu - 選單控制

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("輸入無效,請重新輸入。");
        }
    }
}

2. Book - 業務邏輯與文件操作

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;
    }
}

3. Main - 程式入口

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 統一資源關閉(已在代碼中體現)。
  • 採用 CSV/JSON 格式替代自定義分隔符,便於跨語言交換。
  • 加入單元測試(JUnit)覆蓋 Book 核心邏輯。
  • 將控制台 UI 抽離為介面,未來可遷移至 Swing/JavaFX/Web。

此專案雖簡陋,但完整演示了分層思想(UI/業務/數據)、異常處理、文件 IO、輸入校驗等 Java 基礎核心技能,適合入門者動手重寫、逐步重構。

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