拷贝一个文件的算法比较简单,当然,可以对它进行优化,比如使用缓冲流,提高读写数据的效率等。

话不多说直接上代码

  1. import java.io.*;
  2.  
  3. /**
  4. * 实现文件的拷贝
  5. */
  6. public class CopyFile {
  7.  
  8. /**
  9. * 复制文件夹
  10. *
  11. * @param resource 源路径
  12. * @param target 目标路径
  13. */
  14. public static void copyFolder(String resource, String target) throws Exception {
  15.  
  16. File resourceFile = new File(resource);
  17. if (!resourceFile.exists()) {
  18. throw new Exception("源目标路径:[" + resource + "] 不存在...");
  19. }
  20. File targetFile = new File(target);
  21. if (!targetFile.exists()) {
  22. throw new Exception("存放的目标路径:[" + target + "] 不存在...");
  23. }
  24.  
  25. // 获取源文件夹下的文件夹或文件
  26. File[] resourceFiles = resourceFile.listFiles();
  27.  
  28. for (File file : resourceFiles) {
  29.  
  30. File file1 = new File(targetFile.getAbsolutePath() + File.separator + resourceFile.getName());
  31. // 复制文件
  32. if (file.isFile()) {
  33. System.out.println("文件" + file.getName());
  34. // 在 目标文件夹(B) 中 新建 源文件夹(A),然后将文件复制到 A 中
  35. // 这样 在 B 中 就存在 A
  36. if (!file1.exists()) {
  37. file1.mkdirs();
  38. }
  39. File targetFile1 = new File(file1.getAbsolutePath() + File.separator + file.getName());
  40. copyFile(file, targetFile1);
  41. }
  42. // 复制文件夹
  43. if (file.isDirectory()) {// 复制源文件夹
  44. String dir1 = file.getAbsolutePath();
  45. // 目的文件夹
  46. String dir2 = file1.getAbsolutePath();
  47. copyFolder(dir1, dir2);
  48. }
  49. }
  50.  
  51. }
  52.  
  53. /**
  54. * 复制文件
  55. *
  56. * @param resource
  57. * @param target
  58. */
  59. public static void copyFile(File resource, File target) throws Exception {
  60. // 输入流 --> 从一个目标读取数据
  61. // 输出流 --> 向一个目标写入数据
  62.  
  63. long start = System.currentTimeMillis();
  64.  
  65. // 文件输入流并进行缓冲
  66. FileInputStream inputStream = new FileInputStream(resource);
  67. BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
  68.  
  69. // 文件输出流并进行缓冲
  70. FileOutputStream outputStream = new FileOutputStream(target);
  71. BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
  72.  
  73. // 缓冲数组
  74. // 大文件 可将 1024 * 2 改大一些,但是 并不是越大就越快
  75. byte[] bytes = new byte[1024 * 2];
  76. int len = 0;
  77. while ((len = inputStream.read(bytes)) != -1) {
  78. bufferedOutputStream.write(bytes, 0, len);
  79. }
  80. // 刷新输出缓冲流
  81. bufferedOutputStream.flush();
  82. //关闭流
  83. bufferedInputStream.close();
  84. bufferedOutputStream.close();
  85. inputStream.close();
  86. outputStream.close();
  87.  
  88. long end = System.currentTimeMillis();
  89.  
  90. System.out.println("耗时:" + (end - start) / 1000 + " s");
  91.  
  92. }
  93.  
  94. // 使用示例
  95. public static void main(String[] args) {
  96.  
  97. String rootPath = LoggerUtil.getJarRootPath();
  98. // rootPath = "E:\MyProject\student\target\classes";
  99.  
  100. System.out.println("--------------------------------复制文件-------------------------------------------");
  101.  
  102. File f1 = new File("D:\\GHO\\Windows10企业版.iso");
  103. // 目标文件
  104. File f2 = new File("F:\\logs\\" + "win10.iso");
  105.  
  106. try {
  107. // 这个 win10系统 大概是 3.50G 的 复制过程 花了 156 秒 == 2 分6 秒
  108. copyFile(f1, f2);
  109. } catch (Exception e) {
  110. e.printStackTrace();
  111. }
  112.  
  113. System.out.println("--------------------------------复制文件夹-------------------------------------------");
  114.  
  115. String resource = rootPath + "logs" + File.separator + "job1234";
  116. String target = rootPath + "logs" + File.separator + "job123";
  117. try {
  118. copyFolder(resource, target);
  119. } catch (Exception e) {
  120. e.printStackTrace();
  121. }
  122.  
  123. }
  124.  
  125. }

Java实现复制文件或者文件夹的更多相关文章

  1. JAVA实现复制文件夹

    package com.filetest; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...

  2. java文件和文件夹复制、删除、移动操作

    java文件和文件夹复制.删除.移动操作 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputS ...

  3. Java中实现复制文件或文件夹

     拷贝一个文件的算法比较简单,当然,可以对它进行优化,比如使用缓冲流,提高读写数据的效率等.但是在复制文件夹时,则需要利用Flie类在目标文件夹中创建相应的目录,并且使用递归方法. [java] vi ...

  4. Java基础知识强化之IO流笔记48:IO流练习之 复制单级文件夹案例

    1. 复制单级文件夹     数据源:e:\\demo     目的地:e:\\test 分析: A:封装目录 B:获取该目录下的所有文本的File数组 C:遍历该File数组,得到每一个File对象 ...

  5. java删除文件夹 Java中实现复制文件或文件夹

    删除文件夹 import java.io.File; public class DeleteDir { /** * @param args */ public static void main(Str ...

  6. java 打印流 递归复制子文件子文件夹 不同编码文件复制到同一文件中 序列化流反序列化流

    package com.swift.jinjie; import java.io.BufferedInputStream; import java.io.File; import java.io.Fi ...

  7. java基础 File 递归删除文件夹中所有文件文件夹 目录(包含子目录)下的.java文件复制到e:/abc文件夹中, 并统计java文件的个数

    File 递归删除文件夹中所有文件文件夹 package com.swift.kuozhan; import java.io.File; import java.util.Scanner; /*键盘录 ...

  8. Eclipse点击工程结构里任意文件或文件夹变拖动(或复制)的bug

    本文为原创文章,欢迎转载,但请注明出处http://www.cnblogs.com/yexiubiao/p/5204601.html,未在文章页面明显位置给出原文连接的,将保留追究法律责任的权利. 在 ...

  9. Linux_文件及文件夹[创建][复制][移动][删除][重命名]

    一.文件/文件夹创建 1.文件的创建 touch , vi/vim/nano , ... 语   法: touch [-acfm][-d <日期时间>][-r <参考文件或目 录&g ...

  10. Java中创建操作文件和文件夹的工具类

    Java中创建操作文件和文件夹的工具类 FileUtils.java import java.io.BufferedInputStream; import java.io.BufferedOutput ...

随机推荐

  1. tomcat8.5.37设置虚拟目录

    之前做的solr和tomcat是放在tomcat的webapps下 solr7.2.1+tomcat8.5.37+jdk8安装配置 现在就是放在其他,通过tomcat的server.xml配置虚拟目录 ...

  2. 在Linux上显示某个进程的线程的几种方式

    方法一:PS 在ps命令中,"-T"选项可以开启线程查看.下面的命令列出了由进程号为的进程创建的所有线程. 1.$ ps -T -p 方法二: Top top命令可以实时显示各个线 ...

  3. [转帖]Vim全键盘操作

    https://www.cnblogs.com/pzqu/p/11416436.html Vim脱离鼠标第一步 平时不可缺少的会用到vim,但是避免不了鼠标,事实上,省略鼠标是完全可以的,没有想像中那 ...

  4. 小菜鸟之shell

    Linux shell编程 目录 什么是Shell 1 Shell脚本的执行方式 1 第一种:输入脚本的绝对路径或相对路径 1 第二种:bash或sh +脚本 1 Shell中的变量 2 定义变量 2 ...

  5. Oracle的查询-子查询

    --子查询 --子查询返回一个值 --查询出工资和scott一样的员工信息 select * from emp where sal in (select sal from emp where enam ...

  6. 1.3.2 AQS 读写锁

    1.读写锁原理 2.利用读写锁写一个安全的HashMap 读写锁原理 ReadWriteLock:维护一对关联锁,一个读锁一个写锁,读锁可以由多个线程同时获得,写锁只能被一个线程获得.同一时间,读锁和 ...

  7. -- 1 -- springboot

    目录 一.Maven依赖 二.配置文件 三.RESTful API 四.编写RESTful和测试用例. 五.数据验证 六.异常处理 七.对API的拦截 七.文件上传下载 八.异步处理 框架或工具:Lo ...

  8. MySQL中的触发器应用

    直接上代码: /*数据库 - udi_ems_test*********************************************************************内容:在 ...

  9. 网站页面顶部出现空白行&#65279字符的原因以及完美解决办法

    转自个人博客:https://www.hurbai.com 有时候网页头部会出现一个空白行,查看源码发现body开头初有一个非法字符 // 如果是Windows系统,修改为:$WIN = 1; $W ...

  10. Statefulset的拓扑状态

    Statefulset: 实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,就被称为“有状态应用”(Stateful Application). StatefulSet 的设计其实非常容易理解 ...