首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java File 類完全掌握:6 大建構子、目錄操作、檔案屬性判斷與實戰技巧

     編輯:Java 相關知識

前言

java.io.File 是 Java 檔案系統操作的入口類,**僅代表路徑抽象,不保證檔案實體存在**。本文深度解析 6 個建構子、核心 API、實戰陷阱與最佳實踐。

一、6 大建構子全解析

1.1 公共建構子(4 個)


// 1. 路徑字串(相對/絕對)
public File(String pathname) { ... }
new File("data/config.properties");
new File("/home/user/data/config.properties");
new File("C:\\Users\\data\\config.properties");

// 2. URI
public File(URI uri) { ... }
new File(new URI("file:///home/user/data/config.properties"));

// 3. 父路徑字串 + 子路徑字串
public File(String parent, String child) { ... }
new File("/home/user/data", "config.properties");

// 4. 父 File 物件 + 子路徑字串
public File(File parent, String child) { ... }
File parentDir = new File("/home/user/data");
new File(parentDir, "config.properties");

1.2 私有建構子(2 個,內部使用)

  • File(String pathname, int prefixLength):已正規化路徑
  • File(String child, File parent):子路徑在前,父 File 在後

1.3 路徑分隔符最佳實踐

// 跨平台安全
File file = new File(System.getProperty("user.home"), "data/config.properties");
// 或 Java 7+ Paths
Path path = Paths.get(System.getProperty("user.home"), "data", "config.properties");
File file = path.toFile();

二、目錄與檔案創建操作

方法回傳行為常見坑
mkdir()boolean創建單層目錄,父目錄必須存在父目錄不存在回傳 false,不拋異常
mkdirs()boolean創建多層目錄(含父目錄)部分創建成功後失敗,不回滾
createNewFile()boolean創建新檔案(原子操作)檔案已存在回傳 false;目錄不存在拋 IOException
delete()boolean刪除檔案/空目錄非空目錄回傳 false;不進入回收桶
deleteOnExit()voidJVM 正常關閉時刪除僅正常關閉生效;臨時檔案常用

2.1 實戰:安全創建多層目錄與檔案

public static File safeCreateFile(String dirPath, String fileName) throws IOException {
    File dir = new File(dirPath);
    if (!dir.exists()) {
        if (!dir.mkdirs()) {
            throw new IOException("無法創建目錄: " + dirPath);
        }
    } else if (!dir.isDirectory()) {
        throw new IOException("路徑存在但非目錄: " + dirPath);
    }
    
    File file = new File(dir, fileName);
    if (!file.createNewFile()) {
        // 檔案已存在,根據業務決定覆蓋或拋錯
    }
    return file;
}

三、檔案屬性判斷與獲取

3.1 布林判斷方法

File f = new File("test.txt");
f.exists();        // 檔案/目錄是否存在
f.isFile();        // 是否為檔案
f.isDirectory();   // 是否為目錄
f.isHidden();      // 是否隱藏(平台相關)
f.isAbsolute();    // 是否絕對路徑
f.canRead();       // 可讀
f.canWrite();      // 可寫
f.canExecute();    // 可執行

3.2 獲取檔案資訊


f.getName();              // 檔名(不含路徑)
f.getPath();              // 建構子傳入的路徑
f.getAbsolutePath();      // 絕對路徑字串
f.getCanonicalPath();     // 規範路徑(解析 . .. 符號連結)
f.getParent();            // 父目錄路徑字串
f.getParentFile();        // 父目錄 File 物件
f.length();               // 檔案大小(位元組),目錄回傳 0
f.lastModified();         // 最後修改時間(毫秒時間戳)
new Date(f.lastModified()); // 轉 Date

3.3 列舉目錄內容


// 僅名稱(字串陣列)
String[] names = dir.list(); // 非目錄回傳 null,空目錄回傳長度 0 陣列

// 過濾器版本
String[] javaFiles = dir.list((d, name) -> name.endsWith(".java"));

// File 物件陣列(推薦)
File[] files = dir.listFiles(); // 同樣:非目錄 null,空目錄空陣列
File[] javaFiles = dir.listFiles(f -> f.isFile() && f.getName().endsWith(".java"));

// 遞迴遍歷(Java 7+ NIO.2 更推薦)
Files.walkFileTree(Paths.get("."), new SimpleFileVisitor<>() {
    @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
        System.out.println(file);
        return FileVisitResult.CONTINUE;
    }
});

四、重命名與路徑轉換


// 重命名/移動(同檔案系統原子操作)
boolean success = file.renameTo(new File("/new/path/name.txt"));

// 路徑轉 URI / URL
URI uri = file.toURI();        // file:///path
URL url = file.toURI().toURL(); // file:/path (舊 API)

// 相對路徑轉絕對
File abs = file.getAbsoluteFile();

五、實戰陷阱避坑指南

  1. File 不等於檔案實體:`new File("a.txt")` 不創建檔案,僅封裝路徑
  2. 相對路徑基準:`user.dir` 系統屬性(專案根目錄),非類路徑
  3. list() / listFiles() 回傳 null:非目錄、IO 錯誤、權限不足皆回傳 null,**必須判空**
  4. renameTo 跨檔案系統失效:跨磁碟分區需「複製+刪除」
  5. Windows 路徑分隔符:`\` 需轉義 `\\` 或用 `/`,Java 統一支援 `/`
  6. 檔案鎖定:Windows 下檔案被佔用無法刪除/重命名,需關閉佔用進程
  7. canRead/Write/Execute 權限檢查不可靠:某些系統/檔案系統不支援,實際操作才是唯一檢驗標準

六、現代替代方案:Java NIO.2 (java.nio.file)


Path path = Paths.get("/home/user/data.txt");

// 原子操作、更豐富屬性、更好異常處理
Files.createDirectories(path.getParent());
Files.write(path, "content".getBytes(StandardCharsets.UTF_8));
String content = Files.readString(path, StandardCharsets.UTF_8);
Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING);
Files.move(src, dest, StandardCopyOption.ATOMIC_MOVE);
Files.walk(path).filter(Files::isRegularFile).forEach(System.out::println);

// 屬性讀取
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
attrs.size(); attrs.creationTime(); attrs.lastModifiedTime(); attrs.isDirectory();

總結

File 類是 Java 檔案操作的基石,掌握其建構子語義、目錄操作原子性、屬性判斷邊界條件,是寫出健壯檔案處理代碼的前提。**新專案優先使用 NIO.2 `Path`/`Files` API**,功能更強、異常更精確、支援串流與非同步操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved