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

Java 文件編碼批量轉換工具類實現(GB2312 轉 UTF-8)

     編輯:Java 綜合教學

需求背景

項目遷移或團隊協作時,常遇到源文件編碼不一致(如舊項目用 GB2312,新規範要求 UTF-8)導致中文亂碼。手動轉換效率低且易遺漏,本文提供一個遞歸掃描目錄、批量轉換 .java 文件編碼的工具類,核心思路:按源編碼讀取 → 內存緩衝 → 按目標編碼寫入覆蓋。

核心代碼實現

import java.io.*;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class ChangeFileEncoding {
    /** 處理文件計數 */
    public static int fileCount = 0;
    /** 源文件/目錄絕對路徑 */
    public static String sourceFileRoot = "D:/workspace/old-project/src";
    /** 源編碼 */
    public static String sourceCharset = "GB2312";
    /** 目標編碼 */
    public static String targetCharset = "UTF-8";

    public static void main(String[] args) throws IOException {
        File root = new File(sourceFileRoot);
        convert(root);
        System.out.println("總處理文件數:" + fileCount);
    }

    public static void convert(File file) throws IOException {
        if (file.isFile()) {
            // 僅處理 .java 文件
            if (!file.getName().endsWith(".java")) return;

            // 1. 按源編碼讀取全部內容
            StringBuilder content = new StringBuilder();
            try (BufferedReader br = new BufferedReader(
                    new InputStreamReader(new FileInputStream(file), sourceCharset))) {
                String line;
                while ((line = br.readLine()) != null) {
                    content.append(line).append(System.lineSeparator());
                }
            }

            // 2. 按目標編碼寫入覆蓋原文件
            try (BufferedWriter bw = new BufferedWriter(
                    new OutputStreamWriter(new FileOutputStream(file), targetCharset))) {
                bw.write(content.toString());
            }

            System.out.println("已轉換:" + file.getAbsolutePath());
            fileCount++;
        } else if (file.isDirectory()) {
            // 遞歸處理子文件/目錄
            File[] children = file.listFiles();
            if (children != null) {
                for (File child : children) convert(child);
            }
        }
    }
}

關鍵點解析

  • 編碼參數化:通過 sourceCharset/targetCharset 靈活適配任意編碼互轉(如 ISO-8859-1 → UTF-8)。
  • 行分隔符保留:使用 System.lineSeparator() 自動適配跨平台換行符(Windows \r\n、Linux \n)。
  • try-with-resources:JDK 7+ 自動關閉流,防止資源洩漏。
  • 安全性:建議先備份項目或使用版本控制,工具直接覆蓋原文件,不可逆。

進階優化建議

  1. 編碼自動檢測:集成 juniversalchardet 或 Apache Tika 自動識別源編碼,避免誤指定導致損壞。
  2. 多線程並行:大項目可用 ForkJoinPool 或線程池並行處理,顯著提速。
  3. 過濾機制:增加文件大小限制、編碼校驗(如檢查是否已為 UTF-8)、排除目錄(.git、target)。
  4. 報告生成:輸出轉換日誌(成功/失敗/跳過列表),便於審計。

總結

這個工具類雖簡單,但解決了實際開發中高頻痛點。掌握「流式讀寫 + 編碼轉換 + 遞歸遍歷」模式,可快速構建各類批量文件處理工具(如去 BOM、統一縮進、關鍵字替換等)。

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