筛选指定文件到指定文件夹

138 阅读2分钟

需求:当下载的文件内包含了许多不同的文件而无法快速的进行选择操作时急需一个工具对文件进行筛选操作。

package com.crazymakercircle.other;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 筛选指定文件到指定文件夹
 *
 * @author: doubleZ
 * @created: 2024/01/02
 */
public class FolderClassification {

    /**
     * 旧文件夹
     */
    private static final String OLD_FOLDER = "C:\Users\82794\Desktop\张宇笔记";

    /**
     * 新文件夹
     */
    private static final String NEW_FOLDER = "C:\Users\82794\Desktop\张宇笔记\new";

    /**
     * 日期校验
     */
    private static final String DATE_STR = "20231228";

    public static void main(String[] args) {
        File dirFile = new File(OLD_FOLDER);

        FileFilter fileFilter = new FileFilter() {
            @Override
            public boolean accept(File file) {
                // "13387680xxx高数第1讲2023122818540506";
                // String date = input.substring(16, 24);  ## 20231228
                // String phone = input.substring(0, 11);  ## 13387680xxx

                String name = file.getName();
                // 整理出有 jpeg、jpg、png 作为后缀名的图片
                boolean postFixVerify = name.endsWith(".png") || name.endsWith(".jpg") || name.endsWith(".jpeg");
                // 包含指定日期
                boolean dateVerify = DATE_STR.equals(name.substring(16, 24).toString());

                return postFixVerify && dateVerify;
            }
        };

        List<File> list = new ArrayList<File>();
        try {
            // 查找符合条件的文件
            getFile(dirFile, fileFilter, list);
            // 将正合我意的文件资源放入指定的目录中
            WriteToFile(list);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 查找符合条件的文件
     *
     * @param dir    文件夹路径
     * @param filter 过滤
     * @param list   符合规则的路径
     * @throws IOException IOException
     */
    public static void getFile(File dir, FileFilter filter, List<File> list) throws IOException {
        // 获取目录下的所有文件和子目录
        File[] files = dir.listFiles();
        if (null == files || files.length == 0) {
            System.out.println("files is empty");
            return;
        }
        for (File file : files) {
            // 如果时是目录则进行递归查询
            if (file.isDirectory()) {
                getFile(file, filter, list);
            } else {
                // 校验通过添加到list中
                if (filter.accept(file)) {
                    list.add(file);
                }
            }
        }
    }

    /**
     * 写入指定文件夹
     *
     * @param list 校验通过的文件集合
     * @throws IOException IOException
     */
    public static void WriteToFile(List<File> list) throws IOException {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        int num = 0;
        byte[] bt = new byte[1024];
        try {
            for (File file : list) {
                // 读文件
                fis = new FileInputStream(file);
                // 写文件
                File newFolder = new File(NEW_FOLDER);
                if (!newFolder.exists()) {
                    boolean res = newFolder.mkdir();
                    System.out.println("mkdir result " + res);
                }
                fos = new FileOutputStream(new File(NEW_FOLDER, file.getName()));
                System.out.println(file.getAbsolutePath());
                while ((num = fis.read(bt)) != -1) {
                    fos.write(bt, 0, num);
                    fos.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            assert fis != null;
            fis.close();
            assert fos != null;
            fos.close();
        }
    }
}

参考