博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java复制整个文件夹(对大文件的操作)
阅读量:5024 次
发布时间:2019-06-12

本文共 4692 字,大约阅读时间需要 15 分钟。

摘自: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;
 }
 
}

转载于:https://www.cnblogs.com/wh-king/archive/2013/05/28/3104221.html

你可能感兴趣的文章
【转】IOS数据库操作SQLite3使用详解
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
设计网站大全
查看>>
JVM CUP占用率过高排除方法,windows环境
查看>>
【转】JAVA字符串格式化-String.format()的使用
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
微信架构(转)
查看>>
Web项目中的路径问题
查看>>
js随机数的取整
查看>>
关于解析漏洞
查看>>
十大经典预测算法(六)---集成学习(模型融合算法)
查看>>
用php做一个简单的注册用户功能
查看>>
一款基于css3的3D图片翻页切换特效
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
Sizeof与Strlen的区别与联系
查看>>
hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
查看>>
Flutter 贝塞尔曲线切割
查看>>
golang 的编译安装以及supervisord部署
查看>>