文件批量复制进阶_递归(很实用)

  • 对于要处理的文件,分布在不同文件夹下,需要整合,修改,提取都非常好用

  • introduction

  1. 针对上次文章批量修改文件名,这次在电脑任意盘符批量复制文件夹下所有特定文件
  2. 其中还有部分小小功能需加以实现:文件大小,结合上次批量改名等等,
  3. 希望用到看到的各位求学者可以在评论下方提出点子
  4. 学无止境,在计算机学习中需要  !!!  勤勉  !!! 
  5. 有一句话:世上无难事,庸人自扰之
  • 代码分析

  1. 核心:递归-->过滤器,过滤文件夹和特定文件;遍历文件数组;判断是否存在相同文件,存在则重新命名
  2. 字节缓冲区读取字节数组
  3. 额外实现:全局静态变量记录总数(可以参考之前文章的递归拓展:不死神兔)
  4. 文本扫描器
package com.banma;

import java.io.*;
import java.util.Scanner;

/**
 * User: BanMa
 */
public class App {
    // 定义统计变量记录Java文件的总数
    static int count = 0;

    public static void main(String[] args) throws IOException{
        // 获得源文件夹
        File srcDir = inputFile();
        // 创建目标文件夹对象
        File destDir = new File("E:\\workResources\\04\\");
        destDir.mkdirs();
        // 拷贝Java文件
        copyJavaFile(srcDir, destDir);
        System.out.println("count = " + count);
    }

    /*
     * 将srcDir文件夹下的所有.Java文件拷贝到destDir文件夹下
     */
    public static void copyJavaFile(File srcDir,File destDir) throws IOException{
        // 获得源文件夹下所有的.java文件和子文件夹
        File[] files = srcDir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if(pathname.isDirectory() || pathname.getName().endsWith(".Java" ))return true;
                return false;
            }
        });
        // 遍历文件数组
        for (File file : files) {
            // 判断file是否是文件夹
            if(file.isDirectory()) {
                // 递归调用当前方法
                copyJavaFile(file, destDir);
            } else { // 如果是文件,拷贝到目标文件夹destDir下
                // 获得要拷贝的文件名
                String fileName = file.getName();  // test02.java
                // 在目标文件夹destDir下创建一个同名文件名
                File destFile = new File(destDir,fileName);  // D:/java/112134567832test02.java
                // 判断目标文件是否存在
                if(destFile.exists()) {
                    // 重命名目标文件名
                    destFile = new File(destDir, System.currentTimeMillis() + fileName);
                }
                System.out.println(destFile);
                copyFile(file, destFile);
            }
        }
    }

    /*
     * 字节流缓冲区流读写字节数组
     */
    private static void copyFile(File srcFile, File destFile) throws IOException {
        // 计数器加一
        count ++;
        // 创建字节输入流
        FileInputStream fis = new FileInputStream(srcFile);
        // 创建字节输出流
        FileOutputStream fos = new FileOutputStream(destFile);

        int len = 0;
        byte[] buffer = new byte[1024];
        // 循环读取数据
        while((len = fis.read(buffer)) !=-1) {
            // 利用输出流往输出目的写数据
            fos.write(buffer,0,len);
        }

        // 关闭资源
        fis.close();
        fos.close();
    }

    /*
     * 根据用户输入的路径字符串创建文件对象
     */
    private static File inputFile() {
        // 创建键盘输入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个文件夹路径:");
        //c:aaa
        // 接收用户输入的路径
        String filePath = sc.nextLine();
        // 根据路径字符串创建文件对象
        File dir = new File(filePath);
        if(!dir.exists()) throw new RuntimeException("你输入的文件路径不存在!!!");
        // 判断是否是文件夹
        if(!dir.isDirectory()){
            throw new RuntimeException("输入的路径不是文件夹路径!!!");
        }
        return dir;
    }
}

猜你喜欢

转载自blog.csdn.net/JzCm__/article/details/84680290
今日推荐