JDK 原生 java.io.File 功能極簡,目錄複製、移動、刪除、大小計算皆需自行遞迴實作,程式碼冗長且易出錯。引入 Apache Commons IO 可大幅簡化開發。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
package util;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.*;
public final class FileToolkit {
private static final Log log = LogFactory.getLog(FileToolkit.class);
/** 複製檔案或目錄(保持結構完全一致) */
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, true);
}
/** 刪除檔案或目錄 */
public static void deleteFile(String targetPath) throws IOException {
File target = new File(targetPath);
if (target.isDirectory()) FileUtils.deleteDirectory(target);
else if (target.isFile()) target.delete();
}
/** 移動檔案或目錄(目標不存在自動建立) */
public static void moveFile(String srcPath, String destDir) throws IOException {
File src = new File(srcPath);
File dest = new File(destDir);
if (src.isDirectory()) FileUtils.moveDirectoryToDirectory(src, dest, true);
else if (src.isFile()) FileUtils.moveFileToDirectory(src, dest, true);
}
/** 重新命名檔案/目錄 */
public static boolean renameFile(String srcPath, String newName) {
String parent = new File(srcPath).getParent();
String newPath = (parent == null ? "" : parent + File.separator) + newName;
return new File(srcPath).renameTo(new File(newPath));
}
/** 取得檔案或目錄大小(位元組),失敗回傳 -1 */
public static long genFileSize(String path) {
File f = new File(path);
if (f.isFile()) return f.length();
if (f.isDirectory()) return FileUtils.sizeOfDirectory(f);
return -1L;
}
/** 判斷檔案/目錄是否存在 */
public static boolean isExist(String path) {
return new File(path).exists();
}
/** 列出目錄下符合副檔名的檔案(非遞迴) */
public static String[] listFileBySuffix(String folder, String suffix) {
IOFileFilter filter1 = new SuffixFileFilter(suffix);
IOFileFilter filter2 = new NotFileFilter(DirectoryFileFilter.INSTANCE);
FilenameFilter ff = new AndFileFilter(filter1, filter2);
return new File(folder).list(ff);
}
/** 將字串寫入檔案(自動建立父目錄) */
public static boolean stringToFile(String content, String filePath) {
BufferedReader br = null;
BufferedWriter bw = null;
try {
File f = new File(filePath);
if (!f.getParentFile().exists()) f.getParentFile().mkdirs();
br = new BufferedReader(new StringReader(content));
bw = new BufferedWriter(new FileWriter(f));
char[] buf = new char[1024];
int len;
while ((len = br.read(buf)) != -1) bw.write(buf, 0, len);
bw.flush();
return true;
} catch (IOException e) {
log.error("寫入檔案失敗: " + filePath, e);
return false;
} finally {
try { if (br != null) br.close(); } catch (IOException ignored) {}
try { if (bw != null) bw.close(); } catch (IOException ignored) {}
}
}
}
// 複製整個目錄
FileToolkit.copyFile("D:/data", "E:/backup");
// 移動單一檔案
FileToolkit.moveFile("D:/log.txt", "E:/archive");
// 取得資料夾大小 (MB)
long mb = FileToolkit.genFileSize("D:/project") / 1024 / 1024;
// 列出所有 .xml 檔
String[] xmls = FileToolkit.listFileBySuffix("D:/config", ".xml");
// 寫入字串到檔案
FileToolkit.stringToFile("...", "D:/out/config.xml");
IOException,錯誤處理一致