項目遷移或團隊協作時,常遇到源文件編碼不一致(如舊項目用 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)。juniversalchardet 或 Apache Tika 自動識別源編碼,避免誤指定導致損壞。ForkJoinPool 或線程池並行處理,顯著提速。這個工具類雖簡單,但解決了實際開發中高頻痛點。掌握「流式讀寫 + 編碼轉換 + 遞歸遍歷」模式,可快速構建各類批量文件處理工具(如去 BOM、統一縮進、關鍵字替換等)。