java复制整个文件夹(对大文件的操作)

摘自:http://blog.sina.com.cn/s/blog_6e601baf01013s7l.html
package xy;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
 
public class FileUtils {
 private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
//调用函数
 public static void copyDirectory(File srcDir, File destDir) throws IOException {
  copyDirectory(srcDir, destDir, true);
 }
 
 public static void copyDirectory(File srcDir, File destDir, boolean preserveFileDate) throws IOException {
  copyDirectory(srcDir, destDir, null, preserveFileDate);
 }
 
 public static void copyDirectory(File srcDir, File destDir, FileFilter filter) throws IOException {
  copyDirectory(srcDir, destDir, filter, true);
 }
//开始复制目录
 public static void copyDirectory(File srcDir, File destDir, FileFilter filter, boolean preserveFileDate) throws IOException {
  if (srcDir == null) {
   throw new NullPointerException("Source must not be null");
  }
  if (destDir == null) {
   throw new NullPointerException("Destination must not be null");
  }
  if (srcDir.exists() == false) {
   throw new FileNotFoundException("Source '" + srcDir + "' does not exist");
  }
  if (srcDir.isDirectory() == false) {
   throw new IOException("Source '" + srcDir + "' exists but is not a directory");
  }
  if (srcDir.getCanonicalPath().equals(destDir.getCanonicalPath())) {
   throw new IOException("Source '" + srcDir + "' and destination '" + destDir + "' are the same");
  }
 
  // Cater for destination being directory within the source directory (see IO-141)
  List exclusionList = null;
  if (destDir.getCanonicalPath().startsWith(srcDir.getCanonicalPath())) {
   File[] srcFiles = filter == null ? srcDir.listFiles() : srcDir.listFiles(filter);
   if (srcFiles != null && srcFiles.length > 0) {
    exclusionList = new ArrayList(srcFiles.length);
    for (int i = 0; i < srcFiles.length; i++) {
     File copiedFile = new File(destDir, srcFiles[i].getName());
     exclusionList.add(copiedFile.getCanonicalPath());
    }
   }
  }
  doCopyDirectory(srcDir, destDir, filter, preserveFileDate, exclusionList);
 }
//复制目录
 private static void doCopyDirectory(File srcDir, File destDir, FileFilter filter, boolean preserveFileDate, List exclusionList) throws IOException {
  if (destDir.exists()) {
   if (destDir.isDirectory() == false) {
    throw new IOException("Destination '" + destDir + "' exists but is not a directory");
   }
  } else {
   if (destDir.mkdirs() == false) {
    throw new IOException("Destination '" + destDir + "' directory cannot be created");
   }
   if (preserveFileDate) {
    destDir.setLastModified(srcDir.lastModified());
   }
  }
  if (destDir.canWrite() == false) {
   throw new IOException("Destination '" + destDir + "' cannot be written to");
  }
  // recurse
  File[] files = filter == null ? srcDir.listFiles() : srcDir.listFiles(filter);
  if (files == null) { // null if security restricted
   throw new IOException("Failed to list contents of " + srcDir);
  }
  for (int i = 0; i < files.length; i++) {
   File copiedFile = new File(destDir, files[i].getName());
   if (exclusionList == null || !exclusionList.contains(files[i].getCanonicalPath())) {
    if (files[i].isDirectory()) {
     doCopyDirectory(files[i], copiedFile, filter, preserveFileDate, exclusionList);
    } else {
     doCopyFile(files[i], copiedFile, preserveFileDate);
    }
   }
  }
 }
//开始复制
 private static void doCopyFile(File srcFile, File destFile, boolean preserveFileDate) throws IOException {
  if (destFile.exists() && destFile.isDirectory()) {
   throw new IOException("Destination '" + destFile + "' exists but is a directory");
  }
 
  FileInputStream input = new FileInputStream(srcFile);
  try {
   FileOutputStream output = new FileOutputStream(destFile);
   try {
    copy(input, output);
   } finally {
    try {
     output.close();
    } catch (IOException ioe) {
     // do nothing
    }
   }
  } finally {
   try {
    input.close();
   } catch (IOException ioe) {
    // do nothing
   }
  }
 
  if (srcFile.length() != destFile.length()) {
   throw new IOException("Failed to copy full contents from '" + srcFile + "' to '" + destFile + "'");
  }
  if (preserveFileDate) {
   destFile.setLastModified(srcFile.lastModified());
  }
 }
//测试出要复制的文件数量
 public static int copy(InputStream input, OutputStream output) throws IOException {
  long count = copyLarge(input, output);
  if (count > Integer.MAX_VALUE) {
   return -1;
  }
  return (int) count;
 }
//复制大文件
 public static long copyLarge(InputStream input, OutputStream output) throws IOException {
  byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
  long count = 0;
  int n = 0;
  while (-1 != (n = input.read(buffer))) {
   output.write(buffer, 0, n);
   count += n;
  }
  return count;
 }
 
}

posted on 2013-05-28 18:56  青春丶冭柔情  阅读(638)  评论(0编辑  收藏  举报

导航