A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

将文件夹a下(包括其下所有子文件夹和文件)复制到文件夹b下。
  • 涉及知识点:字节流,缓冲字节流,文件操作,foreach循环,字符串操作,正则表达式,异常捕获处理

实现步骤:
* 复制单级文件夹
*         1.在目标路径创建和源路径同名文件夹
*         2.遍历源路径下的文件,并进行复制
*         3.改进功能:复制多级文件夹
*         4.增加复制文件后改名的功能

注:代码未经调优简化,方便理解,同一功能实现方式可能有多种,此案例仅供参考交流
  1. package cn.itcast;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.util.Scanner;

  9. /*
  10. * 复制单级文件夹
  11. *         1.在目标路径创建和源路径同名文件夹
  12. *         2.遍历源路径下的文件,并进行复制
  13. *         3.改进功能:复制多级文件夹
  14. *         4.增加复制文件后改名的功能
  15. */
  16. public class CopyFileFolder {

  17.         public static void main(String[] args) {
  18.                
  19.                 Scanner sc = new Scanner(System.in);
  20.                 System.out.println("请输入源路径");
  21.                 String sour = sc.nextLine();
  22.                 sour.replace("\\", "\\\\");
  23.                
  24.                 System.out.println("请输入目标路径");
  25.                 String dest = sc.nextLine();
  26.                 dest.replace("\\", "\\\\");
  27.                
  28.                 sc.close();

  29.                 long start = System.currentTimeMillis();
  30.                
  31.                 copyFolder(new File(sour), new File(dest));
  32.                
  33.                 System.out.println("复制完成!!");
  34.                
  35.                 long end = System.currentTimeMillis();
  36.                
  37.                 System.out.println("总共用时 " + (end - start) + " ms");
  38.                
  39.         }

  40.         // 传递源路径和目标路径
  41.         public static void copyFolder(File sourPath, File destPath) {
  42.                 // 获取源文件夹名
  43.                 String folderName = sourPath.getName();
  44.                 // 根据目标路径和源文件夹名创建file对象
  45.                 File destFolder = new File(destPath, folderName);
  46.                
  47.                 // 创建目标文件夹
  48.                 destFolder.mkdirs(); // I:\Knownsec
  49.                 System.out.println("创建文件夹 " + destFolder.getName());

  50.                 // 遍历源路径获取所有文件名和文件夹名
  51.                 File[] files = sourPath.listFiles();
  52.                 for (File file : files) {
  53.                         // 判断如果是文件,获取文件名,进行复制操作
  54.                         if (file.isFile()) {
  55.                                 // 获取文件名字符串形式
  56.                                 String fileName = file.getName();
  57.                                 // System.out.println(fileName);

  58.                                 // 根据目标父路径和源文件名创建file对象
  59.                                 File destFile = new File(destFolder, fileName);

  60.                                 // 传递源文件对象和目标文件对象进行复制操作
  61.                                 copyFile(file, destFile);
  62.                                
  63.                                 rename(destFile);
  64.                         } else { // 是文件夹,递归调用本函数
  65.                                
  66.                                 // 此时,源路径为当前文件夹名,目标路径为刚才创建好的目标路径下的文件夹
  67.                                 copyFolder(file, destFolder);
  68.                         }
  69.                 }

  70.         }

  71.         // 对文件进行重命名
  72.         public static void rename(File destFile) {
  73.                 // 获取文件父路径
  74.                 File parent = destFile.getParentFile();
  75.                 // 对文件名进行切割,方便获取文件扩展名
  76.                 String[] name = destFile.getName().split("\\.");
  77.                 // 将文件名扩展名替换为新的扩展名
  78.                 String child = destFile.getName().replace(name[name.length - 1], "bak");
  79.                 // 根据父路径和新文件名构造新文件对象,
  80.                 File destNew = new File(parent, child);
  81.                 // 传递改名后的新文件对象
  82.                 destFile.renameTo(destNew);
  83.         }

  84.         // 利用缓冲字节流实现读写字节数组实现复制文件
  85.         public static void copyFile(File file, File destFile) {
  86.                 // 声明缓冲字节流对象
  87.                 BufferedInputStream bis = null;
  88.                 BufferedOutputStream bos = null;

  89.                 try {
  90.                         // 创建缓冲字节流对象,封装字节流对象
  91.                         bis = new BufferedInputStream(new FileInputStream(file));
  92.                         bos = new BufferedOutputStream(new FileOutputStream(destFile));

  93.                         long start = System.currentTimeMillis();
  94.                         byte[] b = new byte[1024];
  95.                         int len = 0;
  96.                         System.out.println("正在复制... " + file.getName() + " 文件大小约 " + (file.length()/1024) + " KB");
  97.                         // 利用字节数组复制读写字节流
  98.                         while ((len = bis.read(b)) != -1) {
  99.                                 bos.write(b, 0, len);
  100.                         }
  101.                         long end = System.currentTimeMillis();
  102.                         System.out.println("用时 " + (end - start) + " ms");

  103.                 } catch (IOException e) {
  104.                         e.printStackTrace();
  105.                         throw new RuntimeException("复制失败");
  106.                 } finally {
  107.                         try {
  108.                                 if (bos != null) {
  109.                                         bos.close();
  110.                                 }
  111.                         } catch (IOException e) {
  112.                                 e.printStackTrace();
  113.                                 throw new RuntimeException("关闭资源失败");
  114.                         } finally {
  115.                                 if (bis != null) {
  116.                                         try {
  117.                                                 bis.close();
  118.                                         } catch (IOException e) {
  119.                                                 e.printStackTrace();
  120.                                                 throw new RuntimeException("关闭资源失败");
  121.                                         }
  122.                                 }
  123.                         }
  124.                 }

  125.         }

  126. }
复制代码



CopyFileFolder.zip

1.61 KB, 下载次数: 37

CopyFileFolder.java

1 个回复

正序浏览
仰望中。。。。。赞!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马