之前已經完成了單個檔案夾的拷貝功能,在此基礎上很容易實現多個檔案夾的合并了,套一個for迴圈就可以啦。
package com.xx.test.copy;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class TestCombineDirectory {/** * @param args */public static void main(String[] args) {String[] sourceDirNames = {"D:/LuceneEx","D:/LuceneEx2"};String targetDirName = "D:/LuceneEx_backup";combineDirectory(sourceDirNames,targetDirName);}/** * 合并多個檔案夾到一個檔案夾中 * @param sourceDirNames * @param targetDirName */private static void combineDirectory(String[] sourceDirNames,String targetDirName) {if(sourceDirNames==null || sourceDirNames.length==0){throw new RuntimeException("待合并的檔案夾不存在...");}for(int i=0;i<sourceDirNames.length;i++){copyDir(sourceDirNames[i], targetDirName);}System.out.println("合并所有的檔案夾完成...");}/** * 拷貝目錄,遞迴的方法 * @param sourceDirName * @param targetDirName */public static void copyDir(String sourceDirName, String targetDirName) {File sourceDir = new File(sourceDirName);File targetDir = new File(targetDirName);if(sourceDir==null || !sourceDir.exists()){throw new RuntimeException("待拷貝的檔案夾不存在..."+sourceDir.getAbsolutePath());}if(!sourceDir.isDirectory()){throw new RuntimeException("待拷貝的檔案不是目錄..."+sourceDir.getAbsolutePath());}if(!targetDir.exists()){targetDir.mkdirs();}File[] files = sourceDir.listFiles();for(int i=0;files!=null && i<files.length;i++){if(files[i].isFile()){//複製檔案copyFile(files[i],new File(targetDirName+File.separator+files[i].getName()));}else if(files[i].isDirectory()){//複製目錄,遞迴的方法// 複製目錄 String dir1 = sourceDirName+File.separator+files[i].getName(); String dir2 = targetDirName+File.separator+files[i].getName(); copyDir(dir1, dir2); }}System.out.println("拷貝檔案夾成功..."+sourceDir.getAbsolutePath());}/** * 拷貝單個的檔案 * @param sourceFile源檔案 * @param targetFile目標檔案 */private static void copyFile(File sourceFile, File targetFile) {FileInputStream in = null;BufferedInputStream bis = null;FileOutputStream out = null;BufferedOutputStream bos = null;try {// 建立檔案輸入資料流並對它進行緩衝 in = new FileInputStream(sourceFile); bis = new BufferedInputStream(in); // 建立檔案輸出資料流並對它進行緩衝 out = new FileOutputStream(targetFile); bos = new BufferedOutputStream(out); // 緩衝數組 byte[] b = new byte[1024 * 5]; int len; while ((len =bis.read(b)) != -1) { bos.write(b, 0, len); } // 重新整理此緩衝的輸出資料流 bos.flush(); } catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {if(bos!=null)bos.close();} catch (IOException e) {e.printStackTrace();}try {if(bis!=null)bis.close();} catch (IOException e) {e.printStackTrace();}}}}
有寫的不對的地方或者考慮不完全的情況,還請大家多多指教。另外,如果想效率更高一點,可以考慮使用NIO來完成 單個檔案的拷貝。