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

Java IO 流實戰:讀取文件並調整大括號格式化

     編輯:程式設計綜合問答

本文解析一個 Java 程序:讀取源文件,將每行開頭的 { 移至單獨一行並縮進,其餘行保持換行,最後覆蓋原文件。涉及 Scanner、StringBuilder、PrintWriter 等核心 IO 類。

程序功能

輸入文件示例:

public void method() {
    if (condition) {
        doSomething();
    }
}

處理後:

public void method() 
{
    if (condition) 
    {
        doSomething();
    }
}

代碼逐行解析

1. 參數校驗


if (args.length != 1) {
    System.out.println("Usage: java Exercise9_16 filename");
    System.exit(0);
}

要求命令行傳入一個文件路徑參數。

2. 文件存在性檢查


File sourceFile = new File(args[0]);
if (!sourceFile.exists()) {
    System.out.println("Source file " + args[0] + " not exist");
    System.exit(0);
}

3. 逐行讀取與處理


StringBuilder buffer = new StringBuilder();
Scanner input = new Scanner(sourceFile);

while (input.hasNext()) {
    String s = input.nextLine();      // 讀取一行(不含換行符)
    String s1 = s.trim();             // 去除首尾空白
    System.out.println(s1);           // 控制台輸出處理後的行
    
    if (s1.charAt(0) == '{') {        // 若行首非空字符為 {
        buffer.append(" {");          // 輸出空格+{
        if (s1.length() > 1) {
            // 原行除首字符外的內容換行輸出,並將 { 替換為空格
            buffer.append("\r\n" + s.replace('{', ' '));
        }
    } else {
        buffer.append("\r\n" + s);    // 正常換行輸出原行
    }
}
input.close();

關鍵邏輯:

  • trim() 去除縮進空格,判斷邏輯字符
  • 行首為 { 時:輸出 {,若行有其他內容則換行並將 { 替換為空格
  • 使用 \r\n 保證 Windows 風格換行

4. 覆寫原文件


PrintWriter output = new PrintWriter(sourceFile);
output.print(buffer.toString());
output.close();

注意: 直接覆蓋源文件,建議生產環境先備份或寫入臨時文件再替換。

改進建議

1. 使用 try-with-resources 自動關閉資源(Java 7+)


try (Scanner input = new Scanner(sourceFile, StandardCharsets.UTF_8);
     PrintWriter output = new PrintWriter(sourceFile, StandardCharsets.UTF_8)) {
    
    StringBuilder buffer = new StringBuilder();
    while (input.hasNextLine()) {
        String line = input.nextLine();
        // ... 處理邏輯
    }
    output.print(buffer.toString());
}

2. 指定字符集避免中文亂碼


new Scanner(sourceFile, "UTF-8")
new PrintWriter(sourceFile, "UTF-8")

3. 安全寫入:臨時文件 + 原子替換


File tempFile = File.createTempFile("fmt-", ".tmp", sourceFile.getParentFile());
try (PrintWriter out = new PrintWriter(tempFile, "UTF-8")) {
    out.print(buffer.toString());
}
Files.move(tempFile.toPath(), sourceFile.toPath(), StandardCopyOption.REPLACE_EXISTING);

核心類對比

類用途特點
Scanner文本掃描/解析支持正則分隔符,nextLine() 讀整行
StringBuilder字符串構建線程不安全,高性能,適用單線程拼接
PrintWriter格式化文本輸出不拋 IOException,需 checkError() 檢查
Files現代文件操作NIO.2,支持原子移動、屬性讀取、流式處理

總結

該程序演示了 Java 傳統 IO(java.io)讀取、處理、覆寫文件的完整流程。實際項目中建議:

  1. 使用 NIO.2(Files/Paths)簡化代碼
  2. 顯式指定 UTF-8 編碼
  3. 採用「讀取→臨時文件寫入→原子替換」模式保證數據安全
  4. 考慮使用成熟格式化工具(如 Google Java Format、Spotless)替代手工實現
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved