| 方法 | 行為 | 回傳 |
createNewFile() | 建立新空檔案,已存在則不建立 | boolean (成功 true) |
mkdir() | 建立單層目錄,父目錄不存在失敗 | boolean |
mkdirs() | 建立多層目錄 (含父目錄) | boolean |
delete() | 刪除檔案/空目錄,非空目錄失敗 | boolean |
deleteOnExit() | JVM 正常關閉時刪除 (臨時檔常用) | void |
目錄遍歷與列表
File dir = new File("D:/myDoc");
if (dir.isDirectory()) {
// 1. 列出所有子項 (字串陣列)
String[] names = dir.list();
// 2. 列出所有子項 (File 陣列,推薦)
File[] files = dir.listFiles();
// 3. 過濾器:只列 .txt 檔
File[] txtFiles = dir.listFiles((d, name) -> name.endsWith(".txt"));
// 4. 遞迴遍歷整棵樹
listAll(dir, 0);
}
void listAll(File f, int depth) {
System.out.println(" ".repeat(depth) + (f.isDirectory() ? "[D] " : "[F] ") + f.getName());
if (f.isDirectory()) {
File[] children = f.listFiles();
if (children != null) for (File c : children) listAll(c, depth + 1);
}
}
路徑處理實用技巧
- 路徑分隔符:
File.separator (Windows `\`、Linux `/`),File.pathSeparator (CLASSPATH 分隔符 `;` / `:`)。
- 相對轉絕對:
file.getAbsoluteFile() 回傳絕對路徑的 File 物件。
- 父目錄:
file.getParentFile() 取得父目錄 File 物件 (可能為 null)。
- 重命名/移動:
file.renameTo(new File("newPath")) (跨分區可能失敗,建議用 NIO.2 Files.move)。
現代替代方案:NIO.2 (java.nio.file) - JDK 7+ 強烈推薦
| 舊 API (File) | 新 API (Path/Files) | 優勢 |
file.length() | Files.size(path) | 拋出具體異常、支援符號連結 |
file.delete() | Files.delete(path) | 失敗拋異常而非回傳 false、支援非空目錄遞刪 |
file.renameTo() | Files.move(src, target, REPLACE_EXISTING) | 原子移動、跨檔案系統、覆寫控制 |
| 手寫遞迴遍歷 | Files.walkFileTree(path, visitor) | Visitor 模式、可控制深度、效能更好 |
| 無法取得檔案屬性細節 | Files.readAttributes(path, BasicFileAttributes.class) | 建立時間、最後存取時間、檔案類型等豐富屬性 |
完整實戰範例:檔案資訊查看器
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
public class FileInfoViewer {
public static void main(String[] args) {
File target = new File("D:/myDoc/test.txt");
showInfo(target);
}
static void showInfo(File f) {
if (!f.exists()) {
System.out.println("路徑不存在:" + f.getAbsolutePath());
return;
}
System.out.println("========== 檔案資訊 ==========");
System.out.println("名稱:" + f.getName());
System.out.println("絕對路徑:" + f.getAbsolutePath());
try { System.out.println("規範路徑:" + f.getCanonicalPath()); } catch (IOException ignored) {}
System.out.println("類型:" + (f.isDirectory() ? "目錄" : "檔案"));
System.out.println("大小:" + readableSize(f.length()));
System.out.println("最後修改:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(f.lastModified()));
System.out.println("可讀/可寫/可執行:" + f.canRead() + "/" + f.canWrite() + "/" + f.canExecute());
System.out.println("隱藏屬性:" + f.isHidden());
}
static String readableSize(long bytes) {
if (bytes < 1024) return bytes + " B";
int unit = 1024;
if (bytes < unit * unit) return String.format("%.1f KB", bytes / (double)unit);
if (bytes < unit * unit * unit) return String.format("%.1f MB", bytes / (double)(unit*unit));
return String.format("%.1f GB", bytes / (double)(unit*unit*unit));
}
}
總結
File 適合簡單路徑操作、屬性查詢、小型工具。
- 生產級應用:優先使用 NIO.2 (Path/Files),異常資訊豐富、功能完整、效能更佳。
- 路徑字串拼接務必用
File.separator 或 Paths.get() 保證跨平台相容。
- 上一篇文章: Java FileWriter 寫入文字檔完整指南:緩衝、編碼與資源管理最佳實踐
- 下一篇文章: Java Swing 應用程式自訂標題列圖示完整教學:Toolkit 與 ImageIcon 兩大方案
Copyright ©
程式碼之家 All Rights Reserved