流只管「內容」,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")
../io/test.txt/home/user/io/../io/test.txt/home/user/io/test.txtgetParent() // 字符串,相對路徑構造時可能返回 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(內存映射),解決流「只能順序、單向」的痛點,實現數據庫級文件操作。