java.io.File 類雖不直接處理數據流,但它是文件系統抽象的入口,負責路徑表示、元數據查詢、目錄遍歷、創建/刪除/重命名等元操作。掌握 File API 是進行高效 IO 開發的前提。
// 絕對路徑
File f1 = new File("D:\\test\\1.txt");
// 相對路徑(相對 user.dir)
File f2 = new File("1.txt");
// 父路徑+子路徑組合
File f3 = new File("D:\\test", "1.txt");
// 目錄
File dir = new File("E:\\abc");
跨平台路徑分隔符:代碼中請使用 File.separator 或正斜槓 /(Java 自動轉換),避免硬編碼反斜槓 \\。
| 方法 | 返回值 | 用途 | 注意事項 |
|---|---|---|---|
createNewFile() | boolean | 創建文件(不存在時) | 父目錄必須存在,僅創建文件 |
mkdir() | boolean | 創建單級目錄 | 父目錄不存在則失敗 |
mkdirs() | boolean | 創建多級目錄 | 遞歸創建父目錄,推薦使用 |
delete() | boolean | 刪除文件/空目錄 | 非空目錄需遞歸刪除子項 |
exists() | boolean | 判斷存在性 | 文件/目錄通用 |
isFile() | boolean | 是否文件 | |
isDirectory() | boolean | 是否目錄 | |
getAbsolutePath() | String | 獲取絕對路徑 | 規範化路徑 |
getName() | String | 獲取文件/目錄名 | 不含路徑 |
getParent() | String | 獲取父目錄路徑 | 可能為 null |
length() | long | 文件字節大小 | 目錄返回 0 |
list() | String[] | 子項名稱數組 | 非目錄返回 null |
listFiles() | File[] | 子項 File 對象數組 | 便於遞歸遍歷 |
renameTo(File dest) | boolean | 重命名/移動 | 跨分區可能失敗,目標存在則失敗 |
setReadOnly() | boolean | 設置只讀 | 不可逆(需文件系統支持) |
public String readFile(String path) throws IOException {
StringBuilder sb = new StringBuilder();
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append(System.lineSeparator());
}
}
return sb.toString();
}
public void writeFile(String path, String content) throws IOException {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(path))) {
bw.write(content);
}
}
public void copyBinaryFile(String src, String dest) throws IOException {
try (FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dest)) {
byte[] buffer = new byte[8192]; // 8KB 緩衝區
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
}
}
// 打印目錄樹
public void printTree(File dir, int depth) {
System.out.println(" ".repeat(depth) + dir.getName());
if (dir.isDirectory()) {
File[] children = dir.listFiles();
if (children != null) {
for (File child : children) {
printTree(child, depth + 1);
}
}
}
}
// 刪除目錄樹(後序遍歷)
public void deleteTree(File file) {
if (file.isDirectory()) {
File[] children = file.listFiles();
if (children != null) {
for (File child : children) {
deleteTree(child);
}
}
}
file.delete(); // 刪除空目錄或文件
}
新項目建議優先使用 java.nio.file.Path、Files、FileSystem API:
Files.walkFileTree() 替代手寫遞歸遍歷。Files.copy/move/delete 原子操作、支持 REPLACE_EXISTING、ATOMIC_MOVE 選項。File 類屬於 Legacy API,維護舊項目時仍需精通;新項目請擁抱 NIO.2,享受更豐富、更安全、更高性能的文件系統操作體驗。