文件系統操作是 Java 開發的基礎技能。本文封裝一個實用工具類 JFile,涵蓋建立文件/目錄、創建暫存檔、文件複製四大核心功能,代碼健壯、異常處理完善,可直接作為專案公共庫使用。
| 方法 | 用途 | 關鍵邏輯 |
|---|---|---|
createFile(path) | 建立單個文件(含父目錄) | 檢查存在性、自動創建父目錄、createNewFile() |
createDir(path) | 建立目錄(含多層) | 路徑補全分隔符、mkdirs() |
createTempFile(prefix, suffix, dir) | 創建暫存檔 | 支援指定目錄、File.createTempFile、返回規範路徑 |
copyFile(src, dest) | 文件複製 | 流式讀寫、1444 bytes 緩衝區、資源關閉 |
package com.example.io;
import java.io.*;
public class JFile {
// 建立文件(自動創建父目錄)
public static boolean createFile(String destFileName) {
File file = new File(destFileName);
if (file.exists()) return false; // 已存在
if (destFileName.endsWith(File.separator)) return false; // 是目錄非文件
File parent = file.getParentFile();
if (parent != null && !parent.exists()) {
if (!parent.mkdirs()) return false; // 創建父目錄失敗
}
try {
return file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
// 建立目錄(多層)
public static boolean createDir(String destDirName) {
File dir = new File(destDirName);
if (dir.exists()) return false;
// 確保以分隔符結尾
if (!destDirName.endsWith(File.separator)) {
destDirName += File.separator;
}
return dir.mkdirs();
}
// 創建暫存檔
public static String createTempFile(String prefix, String suffix, String dirName) {
File tempFile;
try {
if (dirName == null) {
tempFile = File.createTempFile(prefix, suffix);
} else {
File dir = new File(dirName);
if (!dir.exists() && !createDir(dirName)) return null;
tempFile = File.createTempFile(prefix, suffix, dir);
}
return tempFile.getCanonicalPath(); // 返回絕對規範路徑
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
// 文件複製(流式,適合大文件)
public static void copyFile(String oldPath, String newPath) {
File src = new File(oldPath);
if (!src.exists()) return;
try (FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(newPath)) {
byte[] buffer = new byte[1444]; // 可調優為 8192 或 65536
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
createNewFile() 與 mkdirs() 為原子操作,但「檢查存在 → 創建」間隙仍有競態風險。高併發場景建議使用 Files.createFile() (NIO.2) 並捕獲 FileAlreadyExistsException。
getCanonicalPath() 解析符號鏈接、相對路徑,返回唯一絕對路徑,避免 getAbsolutePath() 可能保留 .. 等非規範形式。
1444 bytes 為示例值,實際建議 8KB~64KB (8192~65536) 平衡記憶體與系統調用開銷。大文件複製可考慮 FileChannel.transferTo() 零拷貝。
採用 try-with-resources (Java 7+) 自動關閉流,避免洩漏。舊版本需在 finally 塊中手動關閉。
public static void main(String[] args) {
// 建立多層目錄
JFile.createDir("data/logs/2024");
// 建立文件
JFile.createFile("data/logs/2024/app.log");
// 創建暫存檔
String tmp = JFile.createTempFile("upload_", ".tmp", "data/tmp");
System.out.println("暫存檔: " + tmp);
// 複製文件
JFile.copyFile("data/logs/2024/app.log", "data/backup/app.log.bak");
}
JFile 封裝了高頻文件操作,異常處理統一返回布林/空值,調用端無需 try-catch 即可判斷成敗。代碼無第三方依賴,兼容 Java 7+,建議納入專案基礎設施模組,統一管理文件系統交互邏輯。