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

Java 文件操作大全:File API 核心方法實戰封裝工具類

     編輯:Java 程式設計入門

前言:為何需要封裝文件操作工具類?

Java `java.io.File` 類提供了文件與目錄路徑的抽象表示,但其 API 顆粒度較細,實際開發中常需組合多個調用才能完成「複製目錄」、「遞刪刪除」、「移動文件」等常見業務。本文提供一個生產級的 OperateFiles 工具類,涵蓋創建、刪除、複製、移動、路徑解析等高頻操作,代碼經過異常處理與資源關閉優化,可直接落地項目。

核心功能清單

分類方法名功能描述
目錄操作newFolder創建單級/多級目錄
deleteFolder遞歸刪除目錄及其所有內容
copyFolder遞歸複製整個目錄樹
文件操作newFile創建空文件或帶內容創建文件
deleteFile刪除指定文件
copyFile字節流複製單個文件
moveFile / moveFolder複製+刪除源實現移動
路徑工具getExpandedName提取文件擴展名
getFilePath提取文件所在目錄路徑
系統路徑getPath獲取項目類路徑根目錄

關鍵方法源碼解析

1. 遞歸刪除目錄——最易踩坑的操作

public void deleteFolder(String folderPath) {
    try {
        // 先刪除所有子文件/子目錄
        delAllFiles(folderPath); 
        File dir = new File(folderPath);
        if (dir.exists()) {
            dir.delete(); // 最後刪除空目錄
        }
    } catch (Exception e) {
        log.error("刪除目錄失敗: {}", folderPath, e);
    }
}

private void delAllFiles(String folderPath) {
    File file = new File(folderPath);
    if (!file.exists() || !file.isDirectory()) return;
    
    String[] files = file.list();
    for (String name : files) {
        File child = new File(folderPath.endsWith(File.separator) 
            ? folderPath + name : folderPath + File.separator + name);
        
        if (child.isFile()) {
            child.delete();
        } else if (child.isDirectory()) {
            delAllFiles(child.getAbsolutePath()); // 遞歸清空子目錄
            deleteFolder(child.getAbsolutePath()); // 刪除空子目錄
        }
    }
}

關鍵點: 必須先遞歸刪除文件,再刪除空目錄;使用 `File.separator` 保證跨平台兼容。

2. 文件複製——字節流緩衝區優化

public void copyFile(String src, String dest) {
    try (InputStream in = new FileInputStream(src);
         OutputStream out = new FileOutputStream(dest)) {
        
        byte[] buffer = new byte[1024 * 8]; // 8KB 緩衝區
        int len;
        while ((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        out.flush();
    } catch (IOException e) {
        log.error("文件複製失敗: {} -> {}", src, dest, e);
    }
}

使用 try-with-resources 自動關閉流,緩衝區 8KB 平衡內存與性能。

3. 目錄複製——遞歸遍歷+文件複製復用

public void copyFolder(String src, String dest) {
    try {
        new File(dest).mkdirs(); // 確保目標目錄存在
        File srcDir = new File(src);
        for (String name : srcDir.list()) {
            File srcChild = new File(srcDir, name);
            File destChild = new File(dest, name);
            
            if (srcChild.isFile()) {
                copyFile(srcChild.getAbsolutePath(), destChild.getAbsolutePath());
            } else if (srcChild.isDirectory()) {
                copyFolder(srcChild.getAbsolutePath(), destChild.getAbsolutePath()); // 遞歸
            }
        }
    } catch (Exception e) {
        log.error("目錄複製失敗: {} -> {}", src, dest, e);
    }
}

現代化替代方案:Java NIO.2 (Files API)

JDK 7+ 強烈建議使用 `java.nio.file.Files`,代碼更簡潔、支持符號鏈接、屬性讀取、原子操作:

// 複製文件(可選 REPLACE_EXISTING, COPY_ATTRIBUTES)
Files.copy(srcPath, destPath, StandardCopyOption.REPLACE_EXISTING);

// 遞歸複製目錄
Files.walkFileTree(srcDir, new SimpleFileVisitor() {
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
        Files.createDirectories(destDir.resolve(srcDir.relativize(dir)));
        return FileVisitResult.CONTINUE;
    }
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
        Files.copy(file, destDir.resolve(srcDir.relativize(file)), REPLACE_EXISTING);
        return FileVisitResult.CONTINUE;
    }
});

// 刪除目錄樹
Files.walkFileTree(dir, new SimpleFileVisitor() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
        Files.delete(file); return FileVisitResult.CONTINUE;
    }
    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
        Files.delete(dir); return FileVisitResult.CONTINUE;
    }
});

最佳實踐建議

  1. 異常處理:捕獲具體異常(`IOException`、`SecurityException`),記錄完整堆疊與路徑上下文。
  2. 路徑規範化:使用 `File.getCanonicalPath()` 解析 `..`、符號鏈接,避免路徑遍歷攻擊。
  3. 大文件複製:考慮 `FileChannel.transferTo/transferFrom` 零拷貝,或 `mmap` 內存映射。
  4. 併發安全:文件操作非原子,多線程環境下需加鎖或使用臨時文件+重命名保證原子性。

完整工具類下載

文中代碼已整理為可直接使用的 OperateFiles.java,包含詳細 JavaDoc 註釋與單元測試用例。建議根據項目需求裁剪擴展,或直接遷移至 NIO.2 API 獲取更現代化體驗。

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