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

Java File 類操作檔案與目錄屬性完全指南:建立、刪除、遍歷、屬性查詢實戰

     編輯:Java 程式設計入門

File 類核心定位

java.io.File 是檔案系統路徑的抽象表示,不代表實際資料內容。它封裝了檔案/目錄的建立、刪除、重命名、屬性查詢、目錄遍歷等操作,是 Java 檔案系統交互的入口類。

注意:File 物件建立不會觸發磁碟 I/O,僅在呼叫 createNewFile()、mkdir() 等方法時才與檔案系統互動。

核心構造方法

  • new File(String pathname):相對/絕對路徑字串
  • new File(String parent, String child):父路徑 + 子路徑
  • new File(File parent, String child):父 File 物件 + 子路徑
  • new File(URI uri):file:// 協定 URI

檔案/目錄屬性查詢 API 速查

建立與刪除操作

方法回傳說明
exists()boolean路徑是否存在
isFile()boolean是否為檔案
isDirectory()boolean是否為目錄
getName()String檔名/目錄名 (不含路徑)
getPath()String構造時的路徑
getAbsolutePath()String絕對路徑 (解析相對路徑)
getCanonicalPath()String規範路徑 (解析 . .. 符號連結),可能拋 IOException
length()long檔案大小 (位元組),目錄回傳 0
lastModified()long最後修改時間 (毫秒時間戳)
canRead() / canWrite() / canExecute()boolean權限檢查
isHidden()boolean是否隱藏檔

目錄遍歷與列表

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+ 強烈推薦

方法行為回傳
createNewFile()建立新空檔案,已存在則不建立boolean (成功 true)
mkdir()建立單層目錄,父目錄不存在失敗boolean
mkdirs()建立多層目錄 (含父目錄)boolean
delete()刪除檔案/空目錄,非空目錄失敗boolean
deleteOnExit()JVM 正常關閉時刪除 (臨時檔常用)void

完整實戰範例:檔案資訊查看器

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() 保證跨平台相容。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
舊 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)建立時間、最後存取時間、檔案類型等豐富屬性