java实现文件复制上传操作

 更新时间:2016年11月30日 14:06:41   作者:qq_27298687  
这篇文章主要为大家详细介绍了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); 
  } 
}

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

相关文章

  • mybatis多个plugins的执行顺序解析

    mybatis多个plugins的执行顺序解析

    这篇文章主要介绍了mybatis多个plugins的执行顺序解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • intellij IDEA配置springboot的图文教程

    intellij IDEA配置springboot的图文教程

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。接下来通过本文给大家介绍intellij IDEA配置springboot的图文教程,感兴趣的朋友一起看看吧
    2018-03-03
  • spring jpa集成依赖的环境准备及实体类仓库编写教程

    spring jpa集成依赖的环境准备及实体类仓库编写教程

    这篇文章主要为大家介绍了spring jpa集成依赖的环境准备及实体类仓库编写教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java抽象类的概念讲解

    Java抽象类的概念讲解

    今天小编就为大家分享一篇关于Java抽象类的概念讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Java中的this和super实例浅析

    Java中的this和super实例浅析

    要说this和super就不得不说Java的封装和继承了。这篇文章主要介绍了Java中的this和super实例浅析,需要的朋友可以参考下
    2017-03-03
  • java开发之基于Validator接口的SpringMVC数据校验方式

    java开发之基于Validator接口的SpringMVC数据校验方式

    这篇文章主要介绍了java开发之基于Validator接口的SpringMVC数据校验方式,文中附含详细示例代码,有需要的朋友可以借鉴参考下
    2021-09-09
  • SpringBoot通过ip获取归属地的几种方式分享

    SpringBoot通过ip获取归属地的几种方式分享

    在日常我们逛网站的时候会发现我们登录后会出现归属地信息,例如:我在广州登录会显示广东广州,有些更加精确的会显示到区县,那么我们来看看有哪些方式来获取归属地信息,今天我们来聊一聊
    2023-09-09
  • SpringMVC使用MultipartResolver实现文件上传

    SpringMVC使用MultipartResolver实现文件上传

    MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件
    2023-02-02
  • MyBatis 接收数据库中没有的字段的解决

    MyBatis 接收数据库中没有的字段的解决

    这篇文章主要介绍了MyBatis 接收数据库中没有的字段的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java springboot中如何读取配置文件的属性

    java springboot中如何读取配置文件的属性

    大家好,本篇文章主要讲的是java springboot中如何读取配置文件的属性,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论