JDK 原生 IO API 繁瑣且易出錯,Apache Commons IO 提供豐富工具方法。本文封裝 FileUtil 類別,統一處理檔案/目錄複製、刪除、字串寫入、內容讀取與追加寫入,並妥善處理編碼、父目錄自動建立、資源關閉等細節。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.1</version>
</dependency>
package com.pzq.io;
import org.apache.commons.io.FileUtils;
import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
public class FileUtil {
/** 複製檔案或目錄到指定資料夾 */
public static void copyFile(String srcPath, String destDir) throws IOException {
File src = new File(srcPath);
File dest = new File(destDir);
if (src.isDirectory()) {
FileUtils.copyDirectoryToDirectory(src, dest);
} else if (src.isFile()) {
FileUtils.copyFileToDirectory(src, dest);
}
}
/** 刪除檔案或目錄(含子目錄) */
public static void deleteFile(String targetPath) throws IOException {
File target = new File(targetPath);
if (target.isDirectory()) {
FileUtils.deleteDirectory(target);
} else if (target.isFile()) {
if (!target.delete()) throw new IOException("刪除失敗:" + targetPath);
}
}
/** 將字串寫入檔案(自動建立父目錄,UTF-8 編碼) */
public static boolean string2File(String content, String filePath) throws IOException {
File file = new File(filePath);
if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) {
throw new IOException("建立目錄失敗:" + file.getParentFile());
}
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(file), Charset.defaultCharset()));
BufferedReader reader = new BufferedReader(new StringReader(content))) {
char[] buf = new char[1024];
int len;
while ((len = reader.read(buf)) != -1) {
writer.write(buf, 0, len);
}
writer.flush();
}
return true;
}
/** 讀取檔案所有行(UTF-8,自動處理換行符) */
public static List<String> getContentFromFile(String filePath) throws IOException {
File file = new File(filePath);
if (!file.exists()) return new ArrayList<>();
return FileUtils.readLines(file, Charset.defaultCharset());
}
/** 追加內容到檔案末尾 */
public static void addContent(String filePath, List<String> lines) throws IOException {
FileUtils.writeLines(new File(filePath), lines, true); // true = append
}
}
| 需求 | Commons IO 方法 | 備註 |
|---|---|---|
| 複製目錄 | copyDirectoryToDirectory | 保留目錄結構 |
| 複製檔案 | copyFileToDirectory | 目標為資料夾 |
| 刪除目錄 | deleteDirectory | 遞迴刪除 |
| 讀取所有行 | readLines(File, Charset) | 回傳 List<String> |
| 寫入/追加行 | writeLines(File, Collection, boolean append) | 自動換行 |
| 檔案大小 | sizeOf(File) | 遞迴計算目錄大小 |
| 比對內容 | contentEquals(File, File) | 位元組級比對 |
StandardCharsets.UTF_8,避免跨平台亂碼。FileUtils.copyLargeFile 或串流分塊處理。IOException,呼叫端統一捕獲並轉換為業務異常。TemporaryFolder (JUnit) 驗證複製、刪除、讀寫行為。