java实现文件复制上传操作

利用Java复制文件到处都可以用到,这里总结了一个类供大家参考。里面总共有两个方法:

public static boolean copyFile(String srcFileName, String destFileName,boolean overlay);
public static boolean copyDirectory(String srcDirName, String destDirName,boolean overlay) ;

其中:
srcFileName 待复制的文件名
descFileName  目标文件名
overlay  如果目标文件存在,是否覆盖
如果复制成功返回true,否则返回false

代码:

 import java.io.File;
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 javax.swing.JOptionPane; 

/**
 * 复制文件或文件夹
 *
 * zww
 */
public class CopyFileUtil { 

  private static String MESSAGE = ""; 

  /**
   * 复制单个文件
   *
   * @param srcFileName
   *      待复制的文件名
   * @param descFileName
   *      目标文件名
   * @param overlay
   *      如果目标文件存在,是否覆盖
   * @return 如果复制成功返回true,否则返回false
   */
  public static boolean copyFile(String srcFileName, String destFileName,
      boolean overlay) {
    File srcFile = new File(srcFileName); 

    // 判断源文件是否存在
    if (!srcFile.exists()) {
      MESSAGE = "源文件:" + srcFileName + "不存在!";
      JOptionPane.showMessageDialog(null, MESSAGE);
      return false;
    } else if (!srcFile.isFile()) {
      MESSAGE = "复制文件失败,源文件:" + srcFileName + "不是一个文件!";
      JOptionPane.showMessageDialog(null, MESSAGE);
      return false;
    } 

    // 判断目标文件是否存在
    File destFile = new File(destFileName);
    if (destFile.exists()) {
      // 如果目标文件存在并允许覆盖
      if (overlay) {
        // 删除已经存在的目标文件,无论目标文件是目录还是单个文件
        new File(destFileName).delete();
      }
    } else {
      // 如果目标文件所在目录不存在,则创建目录
      if (!destFile.getParentFile().exists()) {
        // 目标文件所在目录不存在
        if (!destFile.getParentFile().mkdirs()) {
          // 复制文件失败:创建目标文件所在目录失败
          return false;
        }
      }
    } 

    // 复制文件
    int byteread = 0; // 读取的字节数
    InputStream in = null;
    OutputStream out = null; 

    try {
      in = new FileInputStream(srcFile);
      out = new FileOutputStream(destFile);
      byte[] buffer = new byte[1024]; 

      while ((byteread = in.read(buffer)) != -1) {
        out.write(buffer, 0, byteread);
      }
      return true;
    } catch (FileNotFoundException e) {
      return false;
    } catch (IOException e) {
      return false;
    } finally {
      try {
        if (out != null)
          out.close();
        if (in != null)
          in.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  } 

  /**
   * 复制整个目录的内容
   *
   * @param srcDirName
   *      待复制目录的目录名
   * @param destDirName
   *      目标目录名
   * @param overlay
   *      如果目标目录存在,是否覆盖
   * @return 如果复制成功返回true,否则返回false
   */
  public static boolean copyDirectory(String srcDirName, String destDirName,
      boolean overlay) {
    // 判断源目录是否存在
    File srcDir = new File(srcDirName);
    if (!srcDir.exists()) {
      MESSAGE = "复制目录失败:源目录" + srcDirName + "不存在!";
      JOptionPane.showMessageDialog(null, MESSAGE);
      return false;
    } else if (!srcDir.isDirectory()) {
      MESSAGE = "复制目录失败:" + srcDirName + "不是目录!";
      JOptionPane.showMessageDialog(null, MESSAGE);
      return false;
    } 

    // 如果目标目录名不是以文件分隔符结尾,则加上文件分隔符
    if (!destDirName.endsWith(File.separator)) {
      destDirName = destDirName + File.separator;
    }
    File destDir = new File(destDirName);
    // 如果目标文件夹存在
    if (destDir.exists()) {
      // 如果允许覆盖则删除已存在的目标目录
      if (overlay) {
        new File(destDirName).delete();
      } else {
        MESSAGE = "复制目录失败:目的目录" + destDirName + "已存在!";
        JOptionPane.showMessageDialog(null, MESSAGE);
        return false;
      }
    } else {
      // 创建目的目录
      System.out.println("目的目录不存在,准备创建。。。");
      if (!destDir.mkdirs()) {
        System.out.println("复制目录失败:创建目的目录失败!");
        return false;
      }
    } 

    boolean flag = true;
    File[] files = srcDir.listFiles();
    for (int i = 0; i < files.length; i++) {
      // 复制文件
      if (files[i].isFile()) {
        flag = CopyFileUtil.copyFile(files[i].getAbsolutePath(),
            destDirName + files[i].getName(), overlay);
        if (!flag)
          break;
      } else if (files[i].isDirectory()) {
        flag = CopyFileUtil.copyDirectory(files[i].getAbsolutePath(),
            destDirName + files[i].getName(), overlay);
        if (!flag)
          break;
      }
    }
    if (!flag) {
      MESSAGE = "复制目录" + srcDirName + "至" + destDirName + "失败!";
      JOptionPane.showMessageDialog(null, MESSAGE);
      return false;
    } else {
      return true;
    }
  } 

  public static void main(String[] args) {
    String srcDirName = "C:/test/test0/test1";
    String destDirName = "c:/ttt";
    CopyFileUtil.copyDirectory(srcDirName, destDirName, true);
  }
}

不考虑多线程优化,单线程文件复制最快的方法是(文件越大该方法越有优势,一般比常用方法快30+%):

private static void nioTransferCopy(File source, File target) {
  FileChannel in = null;
  FileChannel out = null;
  FileInputStream inStream = null;
  FileOutputStream outStream = null;
  try {
    inStream = new FileInputStream(source);
    outStream = new FileOutputStream(target);
    in = inStream.getChannel();
    out = outStream.getChannel();
    in.transferTo(0, in.size(), out);
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    close(inStream);
    close(in);
    close(outStream);
    close(out);
  }
}

如果需要监测复制进度,可以用第二快的方法(留意buffer的大小,对速度有很大影响):

private static void nioBufferCopy(File source, File target) {
  FileChannel in = null;
  FileChannel out = null;
  FileInputStream inStream = null;
  FileOutputStream outStream = null;
  try {
    inStream = new FileInputStream(source);
    outStream = new FileOutputStream(target);
    in = inStream.getChannel();
    out = outStream.getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(4096);
    while (in.read(buffer) != -1) {
      buffer.flip();
      out.write(buffer);
      buffer.clear();
    }
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    close(inStream);
    close(in);
    close(outStream);
    close(out);
  }
}

常用的方法1是:

private static void customBufferBufferedStreamCopy(File source, File target) {
  InputStream fis = null;
  OutputStream fos = null;
  try {
    fis = new BufferedInputStream(new FileInputStream(source));
    fos = new BufferedOutputStream(new FileOutputStream(target));
    byte[] buf = new byte[4096];
    int i;
    while ((i = fis.read(buf)) != -1) {
      fos.write(buf, 0, i);
    }
  }
  catch (Exception e) {
    e.printStackTrace();
  } finally {
    close(fis);
    close(fos);
  }
}

常用的方法2是:

private static void customBufferStreamCopy(File source, File target) {
  InputStream fis = null;
  OutputStream fos = null;
  try {
    fis = new FileInputStream(source);
    fos = new FileOutputStream(target);
    byte[] buf = new byte[4096];
    int i;
    while ((i = fis.read(buf)) != -1) {
      fos.write(buf, 0, i);
    }
  }
  catch (Exception e) {
    e.printStackTrace();
  } finally {
    close(fis);
    close(fos);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java文件复制代码片断(java实现文件拷贝)

    一.要完成这个程序需要了解的知识点: 1.编写简单的Java程序,比如hello world ---废话了....哈哈 2.了解java的文件操作 3.了解java的buffer操作 4.对文件操作的一些异常处理点:1.源文件不能读取到的情况. 2.目的文件创建失败的情况 3.文件锁问题 4.字符乱码问题...可能不全啊 这些是需要用到的包 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor

  • Java实现文件或文件夹的复制到指定目录实例

    整理文档,搜刮出一个Java实现文件或文件夹的复制到指定目录的代码,稍微整理精简一下做下分享. import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class Test { private static int a = 5; public static void main(String[] args) { //需要复制的目标文件或目标文件夹 String path

  • java实现文件复制、剪切文件和删除示例

    复制代码 代码如下: import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException; /** * Java实现文件复制.剪切.删除操作 * 文件指文件或文件夹 * 文件分割符统一用"\\" */ public class FileOperateDemo { /**     * 复制文件或文件夹     * @param srcPa

  • 4种java复制文件的方式

    尽管Java提供了一个可以处理文件的IO操作类,但是没有一个复制文件的方法.复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候.然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式. 1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中. 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B. 这是第一个方法的代码: private static void copyFileUsin

  • java制作复制文件工具代码分享

    复制代码 代码如下: package com.robin; import java.io.File;import java.io.FileInputStream;import java.io.FileWriter;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Properties; public class FileCopy { // priv

  • java 实现文件复制和格式更改的实例

    复制代码 代码如下: package com.chen.lucene.image; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream; public class Change2Image{ /**复制文件  *   * @author chen_weixian  * Mar 11, 2012   11:33:19 PM  * @param path 需要复制文件的路径  * @pa

  • java文件操作工具类实现复制文件和文件合并

    两个方法:1.复制一个目录下面的所有文件和文件夹2.将一个文件目录下面的所有文本文件合并到同一个文件中 复制代码 代码如下: package com.firewolf.test; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException; public class FileReaderUtil { public static void

  • java实现两台服务器间文件复制的方法

    本文实例讲述了java实现两台服务器间文件复制的方法.分享给大家供大家参考.具体分析如下: 通常我们使用最多的文件复制功能就是同服务器之间的文件复制功能,这里介绍的是在普通文件复制上功能升级,可以实现两台服务器实现文件的复制,下面一起来看看代码. 1.服务器端 复制代码 代码如下: package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOut

  • java实现在复制文件时使用进度条(java实现进度条)

    思路分析: 因为既要有操作面板又要有进度条,所以肯定要出现两个继承JFrame类的窗体.先看被调用的进度条窗体,它不需要手动操作,所以类的内部实现一个方法就可以了.因为设计文件操作,所以要捕获异常.首先根据要复制的文件创建File对象,以及根据复制后文件的保存地址创建File对象,然后创建FileOutputStream对象,再创建FileInputStream对象,之后是ProgressMonitorInputStream对象,然后读取文件,如果总耗时超过2秒,将会自动弹出一个进度监视窗口.接

  • Java输入输出流复制文件所用时间对比

    废话不多说,关键代码如下所述: package com.edu.xynu; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class IOUnitCopy {

随机推荐