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

計算機程序的思維邏輯 (59):java.io.File 完全指南 —— 文件元數據、操作與目錄遍歷

     編輯:Java 綜合教學

前言

流只管「內容」,java.io.File 管「文件本身」:元數據、屬性、目錄結構、創建刪除重命名。它封裝了操作系統差異,提供統一 API。


構造方法

new File(String pathname)           // 相對/絕對路徑
new File(String parent, String child) // 父路徑 + 子路徑
new File(File parent, String child)   // 父 File + 子路徑

注意:new File() 只創建內存對象,**不創建磁盤文件**,路徑不可變。


一、文件元數據與路徑

路徑三兄弟

getPath()        // 構造時傳入的路徑(可能相對)
getAbsolutePath() // 絕對路徑(補全當前工作目錄),可能含冗余如 ".."
getCanonicalPath() // 標準絕對路徑(解析 ".."、符號鏈接),唯一標識

示例:工作目錄 /home/user/io,new File("../io/test.txt")

  • getPath(): ../io/test.txt
  • getAbsolutePath(): /home/user/io/../io/test.txt
  • getCanonicalPath(): /home/user/io/test.txt

父路徑獲取

getParent()      // 字符串,相對路徑構造時可能返回 null
getParentFile()  // File 對象
getCanonicalFile().getParent() // 相對路徑也能正確獲取父目錄

路徑分隔符常量

  • File.separator / separatorChar:文件路徑分隔符(Win \,Linux /)
  • File.pathSeparator / pathSeparatorChar:列表分隔符(Win ;,Linux :,如 PATH/CLASSPATH)

基本屬性

exists()         // 是否存在
isFile() / isDirectory() // 類型
length()         // 文件字節數,目錄無意義
lastModified()   // 最後修改時間戳(毫秒)
setLastModified(time) // 修改時間

無創建時間:Linux/Unix 無此概念,跨平台 API 不提供。

權限與安全

canRead() / canWrite() / canExecute()
isHidden()
setReadOnly() / setReadable(r, ownerOnly) / setWritable(w, ownerOnly) / setExecutable(x, ownerOnly)

二、文件操作

createNewFile()           // 創建空文件,存在則 false
delete()                  // 刪除文件/空目錄,非空目錄失敗
deleteOnExit()            // JVM 正常退出時刪除
renameTo(File dest)       // 重命名/移動,跨文件系統可能失敗

臨時文件

createTempFile(prefix, suffix)           // 系統臨時目錄
createTempFile(prefix, suffix, directory) // 指定目錄
// prefix ≥ 3 字符,suffix 默 .tmp

三、目錄操作

mkdir()   // 創建單級目錄,父目錄不存在失敗
mkdirs()  // 創建多級目錄(含父目錄)

遍歷

list()                    // String[] 文件名
list(FilenameFilter)      // 過濾文件名
listFiles()               // File[] 對象
listFiles(FileFilter)     // 過濾 File
listFiles(FilenameFilter) // 過濾文件名

過濾器接口:

public static long sizeOf(File dir) {
            long size = 0;
            for (File f : dir.listFiles()) {
                if (f.isFile()) size += f.length();
                else size += sizeOf(f);
            }
            return size;
        }
  • 查找指定文件名
    public static List<File> find(File dir, String name) {
                List<File> res = new ArrayList<>();
                for (File f : dir.listFiles()) {
                    if (f.isFile() && f.getName().equals(name)) res.add(f);
                    else if (f.isDirectory()) res.addAll(find(f, name));
                }
                return res;
            }
  • 刪除非空目錄
    public static void deleteRecursive(File f) throws IOException {
                if (f.isFile()) { if (!f.delete()) throw new IOException("刪除失敗: " + f); }
                else { for (File c : f.listFiles()) deleteRecursive(c); if (!f.delete()) throw new IOException("刪除失敗: " + f); }
            }

  • 小結與展望

    File 是文件系統的「元數據視圖」,不處理內容。下一節將介紹 RandomAccessFile(隨機讀寫)與 MappedByteBuffer(內存映射),解決流「只能順序、單向」的痛點,實現數據庫級文件操作。

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