String path = File.separator + "home" + File.separator + "user" + File.separator + "work" + File.separator;
// 方式一:父目錄 + 子檔名
File f1 = new File(path, "test.txt");
// 方式二:絕對路徑字串
File f2 = new File(path + "demo.txt");
// 方式三:父目錄 File + 子檔名
File dir = new File(path);
File f3 = new File(dir, "hello.txt");
File f = new File("/home/user/work/demo.txt");
try {
boolean created = f.createNewFile(); // 已存在回傳 false,不覆蓋
boolean deleted = f.delete(); // 刪除成功回傳 true
f.deleteOnExit(); // JVM 退出時刪除(臨時檔清理利器)
} catch (IOException e) { e.printStackTrace(); }
File f = new File("/home/user/work/Demo.txt");
System.out.println("可執行:" + f.canExecute());
System.out.println("存在:" + f.exists());
System.out.println("可讀:" + f.canRead());
System.out.println("可寫:" + f.canWrite());
System.out.println("絕對路徑:" + f.isAbsolute());
System.out.println("是檔案:" + f.isFile());
System.out.println("是目錄:" + f.isDirectory());
System.out.println("隱藏:" + f.isHidden());
File f1 = new File(path, "abc");
f1.mkdir(); // 單層目錄,父目錄必須存在
File f2 = new File(path, "d/e/f/g");
f2.mkdirs(); // 遞歸建立多層目錄
File f = new File("/home/user/work/demo.txt");
System.out.println("絕對路徑字串:" + f.getAbsolutePath());
System.out.println("絕對路徑 File:" + f.getAbsoluteFile());
System.out.println("檔名:" + f.getName());
System.out.println("構造路徑:" + f.getPath());
System.out.println("父目錄:" + f.getParent()); // 若構造用相對路徑可能回傳 null
File[] roots = File.listRoots(); // 靜態方法
for (File root : roots) {
System.out.println(root); // Linux: / Windows: C:\, D:\...
}
File dir = new File("/opt");
// 方式一:回傳檔名字串陣列
String[] names = dir.list();
for (String n : names) System.out.println(n);
// 方式二:回傳 File 陣列(推薦,攜帶路徑資訊)
File[] files = dir.listFiles();
for (File f : files) System.out.println(f.getAbsolutePath());
public static void printAll(File f) {
if (f.isDirectory()) {
File[] children = f.listFiles();
if (children != null) { // 防權限不足回傳 null
for (File child : children) printAll(child);
}
} else {
System.out.println(f.getAbsolutePath());
}
}
JDK 7+ 強烈建議使用 java.nio.file 套件:
| 傳統 File | NIO.2 Path / Files | 優勢 |
|---|---|---|
new File(path) | Paths.get(path) / Path.of(path) (JDK 11+) | 不可變、執行緒安全、支援符號連結 |
f.mkdirs() | Files.createDirectories(path) | 異常細粒度、原子性選項 |
f.listFiles() | Files.list(path) / Files.walk(path) | 回傳 Stream<Path>,支援函數式過濾、並行 |
f.delete() | Files.deleteIfExists(path) | 不拋例外、可跟蹤符號連結 |
f.renameTo() | Files.move(src, target, REPLACE_EXISTING, ATOMIC_MOVE) | 跨檔案系統、原子移動、覆蓋控制 |
| 手工遞歸 | Files.walkFileTree(path, visitor) | 訪問者模式、可控制遍歷行為、效能更佳 |
Files.walk(Paths.get("/opt"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
java.io.File是歷史產物,API 設計有缺陷(回傳值不一致、錯誤處理弱、無符號連結支援)。
新專案請直接使用java.nio.file.Path/Files,享受 Stream 流式處理、完善異常、跨平台一致性與現代化 API。