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

Java 文件與目錄操作大全:建立、複製、暫存檔一站式範例

     編輯:Java 相關知識

前言

文件系統操作是 Java 開發的基礎技能。本文封裝一個實用工具類 JFile,涵蓋建立文件/目錄、創建暫存檔、文件複製四大核心功能,代碼健壯、異常處理完善,可直接作為專案公共庫使用。

功能清單

方法用途關鍵邏輯
createFile(path)建立單個文件(含父目錄)檢查存在性、自動創建父目錄、createNewFile()
createDir(path)建立目錄(含多層)路徑補全分隔符、mkdirs()
createTempFile(prefix, suffix, dir)創建暫存檔支援指定目錄、File.createTempFile、返回規範路徑
copyFile(src, dest)文件複製流式讀寫、1444 bytes 緩衝區、資源關閉

完整工具類代碼

package com.example.io;

import java.io.*;

public class JFile {

    // 建立文件(自動創建父目錄)
    public static boolean createFile(String destFileName) {
        File file = new File(destFileName);
        if (file.exists()) return false; // 已存在
        if (destFileName.endsWith(File.separator)) return false; // 是目錄非文件

        File parent = file.getParentFile();
        if (parent != null && !parent.exists()) {
            if (!parent.mkdirs()) return false; // 創建父目錄失敗
        }

        try {
            return file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    // 建立目錄(多層)
    public static boolean createDir(String destDirName) {
        File dir = new File(destDirName);
        if (dir.exists()) return false;

        // 確保以分隔符結尾
        if (!destDirName.endsWith(File.separator)) {
            destDirName += File.separator;
        }

        return dir.mkdirs();
    }

    // 創建暫存檔
    public static String createTempFile(String prefix, String suffix, String dirName) {
        File tempFile;
        try {
            if (dirName == null) {
                tempFile = File.createTempFile(prefix, suffix);
            } else {
                File dir = new File(dirName);
                if (!dir.exists() && !createDir(dirName)) return null;
                tempFile = File.createTempFile(prefix, suffix, dir);
            }
            return tempFile.getCanonicalPath(); // 返回絕對規範路徑
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    // 文件複製(流式,適合大文件)
    public static void copyFile(String oldPath, String newPath) {
        File src = new File(oldPath);
        if (!src.exists()) return;

        try (FileInputStream fis = new FileInputStream(src);
             FileOutputStream fos = new FileOutputStream(newPath)) {

            byte[] buffer = new byte[1444]; // 可調優為 8192 或 65536
            int len;
            while ((len = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

關鍵實現細節

1. 原子性與競態條件

createNewFile() 與 mkdirs() 為原子操作,但「檢查存在 → 創建」間隙仍有競態風險。高併發場景建議使用 Files.createFile() (NIO.2) 並捕獲 FileAlreadyExistsException。

2. 路徑規範化

getCanonicalPath() 解析符號鏈接、相對路徑,返回唯一絕對路徑,避免 getAbsolutePath() 可能保留 .. 等非規範形式。

3. 緩衝區大小選擇

1444 bytes 為示例值,實際建議 8KB~64KB (8192~65536) 平衡記憶體與系統調用開銷。大文件複製可考慮 FileChannel.transferTo() 零拷貝。

4. 資源管理

採用 try-with-resources (Java 7+) 自動關閉流,避免洩漏。舊版本需在 finally 塊中手動關閉。

使用範例

public static void main(String[] args) {
    // 建立多層目錄
    JFile.createDir("data/logs/2024");

    // 建立文件
    JFile.createFile("data/logs/2024/app.log");

    // 創建暫存檔
    String tmp = JFile.createTempFile("upload_", ".tmp", "data/tmp");
    System.out.println("暫存檔: " + tmp);

    // 複製文件
    JFile.copyFile("data/logs/2024/app.log", "data/backup/app.log.bak");
}

總結

JFile 封裝了高頻文件操作,異常處理統一返回布林/空值,調用端無需 try-catch 即可判斷成敗。代碼無第三方依賴,兼容 Java 7+,建議納入專案基礎設施模組,統一管理文件系統交互邏輯。

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