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

Java IO 實戰:基於文件持久化的用戶註冊/登錄/日誌系統完整實現

     編輯:Java 綜合教學

項目背景與需求

模擬一個輕量級用戶認證系統,僅使用 Java IO 流與文件持久化,實現:

  1. 用戶註冊(用戶名/密碼去重存儲)
  2. 用戶登錄(驗證並記錄登錄時間)
  3. 登錄日誌查詢(普通用戶查自己,管理員查所有)
  4. 控制台交互菜單

核心類設計

類職責關鍵方法
User數據載體name, password, time + toString() 格式化
AdminUser業務控制器userRegister, userLogin, readUser, splitFile, writeUser
Test交互入口main 循環菜單,Scanner 接收輸入

關鍵技術點解析

1. 文件追加寫入:FileOutputStream(file, true)

ps = new PrintStream(new FileOutputStream(file, true), true); // true = autoFlush
System.setOut(ps);                  // 重定向標準輸出到文件
System.out.println(user);           // 直接打印 User.toString()
System.setOut(out);                 // 恢復控制台輸出

注意: 必須保存原始 System.out 引用,寫入後及時恢復,否則後續控制台輸出會「消失」。

2. 文件解析重構對象:splitFile()

public void splitFile(String file, Set set) {
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String line;
        while ((line = br.readLine()) != null) {
            String[] parts = line.split(",");
            // 格式:User [name=xxx, password=yyy, time=zzz]
            String name = parts[0].substring(parts[0].indexOf('=')+1, parts[0].lastIndexOf(','));
            String pwd  = parts[1].substring(parts[1].indexOf('=')+1, parts[1].lastIndexOf(','));
            String time = parts[2].substring(parts[2].indexOf('=')+1, parts[2].length()-1);
            set.add(new User(name, pwd, time));
        }
    } catch (IOException e) { e.printStackTrace(); }
}

使用 try-with-resources 自動關流,解析邏輯針對 User.toString() 格式定制。

3. 登錄時間生成:SimpleDateFormat + Locale

public String loginTime() {
    return new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss", Locale.CHINA)
           .format(new Date());
}

4. 併發安全初探

當前實現為單線程控制台程序,HashSet 非線程安全。若擴展為多線程服務端,需:

  • 用 ConcurrentHashMap.newKeySet() 替換 HashSet
  • 文件寫入加鎖或改用 ReentrantLock 保護關鍵區
  • 或引入嵌入式數據庫(H2/SQLite)替代文件存儲

完整運行流程演示

-----歡迎使用xxx系統-----
1.註冊用戶 2.登錄用戶
3.管理員登錄 4.退出
請輸入序號:1
-----用戶註冊:-----
請輸入用戶名:alice
請輸入密碼:123456
請確認密碼:123456
註冊成功!

請輸入序號:2
-----用戶登錄:-----
請輸入用戶名:alice
請輸入密碼:123456
親愛的alice,您的登錄記錄為:
User [name=alice, password=123456, time=2024年01月15日 14:30:22]
您現於2024年01月15日 14:35:10登錄!

代碼優化建議

  1. 密碼加密: 存儲前用 BCrypt/Argon2 哈希,永不存明文。
  2. 異常處理: 自定義 UserNotFoundException、PasswordMismatchException 替代通用 Exception。
  3. 資源管理: 全面使用 try-with-resources,消除 finally 塊樣板代碼。
  4. 配置外部化: 文件路徑移至 config.properties,支持多環境部署。
  5. 單元測試: 為 AdminUser 各方法編寫 JUnit 測試,覆蓋註冊、登錄、日誌查詢主流程。

總結

本案例展示了 Java IO 流(FileInputStream/OutputStream、BufferedReader、PrintStream)構建完整業務系統的全過程。雖生產環境多用數據庫,但理解文件級持久化原理,對排查 IO 瓶頸、設計緩存策略、實現嵌入式存儲均有裨益。

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