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

Java 文件操作工具類:目錄遞歸複製與多文件合併實戰

     編輯:Java 相關知識

前言

文件系統操作是 Java 開發中高頻需求。本文提供生產級工具類,實現兩大核心功能:目錄結構完整遞歸複製、多文本文件合併為單一文件。代碼採用流式處理,記憶體佔用穩定,支援大文件場景。

功能一:目錄遞歸完整複製

copyFiles 方法採用深度優先遞歸策略,完整保留目錄層級結構。針對文件採用 1KB 緩衝區流式讀寫,針對目錄自動創建對應子目錄並繼續遞歸。

/**
 * 拷貝某個文件目錄下的所有文件與子目錄
 * @param sourceFile 源文件/目錄
 * @param desFile 目標目錄
 */
private static void copyFiles(File sourceFile, File desFile) throws IOException {
    if (sourceFile.isFile()) {
        // 文件直接複製
        File targetFile = new File(desFile.getPath() + "/" + sourceFile.getName());
        try (FileInputStream fis = new FileInputStream(sourceFile);
             FileOutputStream fos = new FileOutputStream(targetFile)) {
            byte[] buf = new byte[1024];
            int len;
            while ((len = fis.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }
        }
    } else {
        // 目錄遞歸處理
        File targetDir = new File(desFile.getPath() + "/" + sourceFile.getName());
        if (!targetDir.exists()) targetDir.mkdir();
        String[] names = sourceFile.list();
        if (names != null) {
            for (String name : names) {
                copyFiles(new File(sourceFile.getPath() + "/" + name), targetDir);
            }
        }
    }
}

功能二:多文本文件合併

mergeFile 方法遞歸遍歷源目錄,將所有非目錄文件內容順序追加寫入目標文件。採用追加模式 (FileOutputStream 第二參數 true) 實現多文件內容串聯。

/**
 * 將目錄下所有文本文件合併到單一文件
 * @param sourceFile 源目錄
 * @param decFile 目標合併文件
 * @return 目標文件引用
 */
private static File mergeFile(File sourceFile, File decFile) throws IOException {
    String[] fileList = sourceFile.list();
    if (fileList != null) {
        for (String fileName : fileList) {
            File file = new File(sourceFile.getPath() + "/" + fileName);
            if (!file.isDirectory()) {
                try (FileInputStream fis = new FileInputStream(file);
                     FileOutputStream fos = new FileOutputStream(decFile, true)) {
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = fis.read(buffer)) != -1) {
                        fos.write(buffer, 0, len);
                    }
                }
            } else {
                // 子目錄遞歸合併
                decFile = mergeFile(file, decFile);
            }
        }
    }
    return decFile;
}

主程式調用示例

展示兩種功能的實際調用方式,路徑參數請根據實際環境修改。

public static void main(String[] args) {
    try {
        // 合併文件示例(註釋掉)
        // mergeFile(new File("C:/source_dir"), new File("D:/all.sql"));
        
        // 目錄複製示例
        copyFiles(new File("G:/學習資料/筆記"), new File("G:/Test"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

關鍵技術點解析

技術點實現方式優勢
遞歸遍歷File.list() + isDirectory() 判斷簡潔處理任意深度目錄結構
流式讀寫1024 字節緩衝區 + while 循環恆定記憶體佔用,支援超大文件
資源管理try-with-resources (JDK 7+)自動關閉流,防止資源洩漏
追加寫入FileOutputStream(file, true)無需載入全文即可合併多文件
路徑拼接手動拼接 + File.separator 建議跨平台相容性更好

生產環境優化建議

  • 異常細化:區分 FileNotFoundException、PermissionDenied 等具體異常類型處理
  • 進度回調:新增 ProgressListener 接口,實時回調複製/合併進度
  • 過濾機制:支援文件擴展名過濾、大小限制、修改時間篩選
  • 並發優化:大量小文件場景可採用線程池並發複製,大文件維持單線程順序寫入
  • 校驗機制:複製完成後計算 MD5/CRC32 校驗碼驗證數據完整性
  • 符號鏈接處理:新增對符號鏈接的識別與處理策略(複製鏈接還是複製目標)
  • 空目錄保留:當前實現會複製空目錄,可根據需求選擇是否保留

常見陷阱提醒

  1. Windows 路徑分隔符為 \,建議使用 File.separator 或 Paths.get() 跨平台構建路徑
  2. sourceFile.list() 可能返回 null(非目錄或無權限),需非空判斷
  3. 大文件合併時目標文件可能超過文件系統單文件大小限制(FAT32 4GB)
  4. 遞歸深度過大可能導致 StackOverflowError,極深目錄結構建議改用迭代式遍歷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved