首页 > 编程语言 >Java递归查询文件下所有的图片,移动到指定文件夹中,分批次建立子文件夹

Java递归查询文件下所有的图片,移动到指定文件夹中,分批次建立子文件夹

时间:2023-12-31 13:35:39浏览次数:42  
标签:files return file 递归 fileSuffix 文件夹 File Java


1. 代码实例

/Users/shiheng/desktop/测试文件 目录下的图片(包含子文件夹目录下的图片)移动到了 /Users/shiheng/desktop/测试结果 目录下,默认不分批次建立子文件夹,重名文件只保存一个,代码如下所示:

package com.syrdbt.java.study;

import java.io.File;
import java.util.*;

/**
 * @author syrdbt
 * @date 2020-10-09
 */
public class FileUtils {

    public static void main(String[] args) {

        File inputFile = new File("/Users/shiheng/desktop/测试文件");
        String outputPath = "/Users/shiheng/desktop/测试结果";

        List<File> files = FileUtils.listAllImageFile(inputFile);
        System.out.println("图片文件总数量:" + files.size());

        // 按照名称进行排序
        files.sort(new Comparator<File>() {
            @Override
            public int compare(File file1, File file2) {
                return file1.getName().compareTo(file2.getName());
            }
        });

        // 分批次存储标志, true:分批次存储,false:不分批次存储
        boolean batchSaveFlag = false;
        // 一批次的文件数量
        int batchFileNumber = 10;
        int totalFileSize = files.size();

        // 不分批次
        if (!batchSaveFlag) {
            for (File file : files) {
                String newFilePath = outputPath + "/" + file.getName();
                File newFile = new File(newFilePath);
                file.renameTo(newFile);
            }
            return;
        }

        // 分批次
        for (int i = 0; i < totalFileSize; i += batchFileNumber) {
            int start = i + 1;
            int end = start + batchFileNumber - 1;
            String newDirPath = outputPath + "/" + start + "-" + end;
            File newChildDir = new File(newDirPath);
            //如果文件夹不存在,创建文件夹
            if (!newChildDir.exists()) {
                newChildDir.mkdir();
            }

            for (int j = 0; j < batchFileNumber; j++) {
                if (i + j >= files.size()) {
                    break;
                }
                String newFilePath = newDirPath + "/" + files.get(i + j).getName();
                File newFile = new File(newFilePath);
                files.get(i + j).renameTo(newFile);
            }
        }
    }

    /**
     * 查询文件夹下的所有图片文件
     */
    public static List<File> listAllImageFile(File file) {
        List<File> resultList = new ArrayList<>();
        if (file == null || file.listFiles() == null || 0 == file.listFiles().length) {
            return new ArrayList<File>();
        }

        for (File tempFile : file.listFiles()) {
            if (tempFile.isDirectory()) {
                // 递归遍历文件夹
                resultList.addAll(listAllImageFile(tempFile));
            } else {
                if (isImage(tempFile)) {
                    resultList.add(tempFile);
                }
            }
        }
        return resultList;
    }

    /**
     * 判断一个文件是不是图片文件
     */
    public static boolean isImage(File file) {
        if (file == null) {
            return false;
        }

        String fileName = file.getName();
        if (fileName == null || "".equals(fileName)) {
            return false;
        }

        List<String> splitFileNames = Arrays.asList(fileName.split("\\."));
        if (splitFileNames.size() != 2) {
            System.out.println("错误的文件格式,路径" + file.getPath() + " 名称:" + file.getName());
            return false;
        }

        String fileSuffix = splitFileNames.get(1);
        if (fileSuffix.equals("jpg") || fileSuffix.equals("png") | fileSuffix.equals("jpeg")
                || fileSuffix.equals("JPG") || fileSuffix.equals("PNG") || fileSuffix.equals("JPEG")) {
            return true;
        }
        System.out.println("错误的文件格式,路径" + file.getPath() + " 名称:" + file.getName());
        return false;
    }

}

2. 测试

测试数据, /Users/shiheng/desktop/测试文件 下的子文件夹和图片,如下图所示:

Java递归查询文件下所有的图片,移动到指定文件夹中,分批次建立子文件夹_desktop


手动创建 /Users/shiheng/desktop/测试结果 文件夹。

Java递归查询文件下所有的图片,移动到指定文件夹中,分批次建立子文件夹_List_02


运行main 函数,结果如下图所示(那些错误的文件格式可以忽略,.DS_Store(英文全称 Desktop Services Store)是一种由苹果公司的macOS操作系统所创造的隐藏文件,目的在于存贮目录的自定义属性):

Java递归查询文件下所有的图片,移动到指定文件夹中,分批次建立子文件夹_List_03


移动到测试结果文件夹的图片如下所示,只有31个,同名文件只留下一个(xugao1.jpg 同名):

Java递归查询文件下所有的图片,移动到指定文件夹中,分批次建立子文件夹_java_04

3. 图片分批次存储

将测试结果文件夹的图片分批次保存在该文件夹(测试结果文件)中,文件会按照名称排序再移动到子文件夹中,上面的示例代码修改 inputFile和batchSaveFlag:

package com.syrdbt.java.study;

import java.io.File;
import java.util.*;

/**
 * @author syrdbt
 * @date 2020-10-09
 */
public class FileUtils {

    public static void main(String[] args) {

        File inputFile = new File("/Users/shiheng/desktop/测试结果");
        String outputPath = "/Users/shiheng/desktop/测试结果";

        List<File> files = FileUtils.listAllImageFile(inputFile);
        System.out.println("图片文件总数量:" + files.size());

        // 按照名称进行排序
        files.sort(new Comparator<File>() {
            @Override
            public int compare(File file1, File file2) {
                return file1.getName().compareTo(file2.getName());
            }
        });

        // 分批次存储标志, true:分批次存储,false:不分批次存储
        boolean batchSaveFlag = true;
        // 一批次的文件数量
        int batchFileNumber = 10;
        int totalFileSize = files.size();

        // 不分批次
        if (!batchSaveFlag) {
            for (File file : files) {
                String newFilePath = outputPath + "/" + file.getName();
                File newFile = new File(newFilePath);
                file.renameTo(newFile);
            }
            return;
        }

        // 分批次
        for (int i = 0; i < totalFileSize; i += batchFileNumber) {
            int start = i + 1;
            int end = start + batchFileNumber - 1;
            String newDirPath = outputPath + "/" + start + "-" + end;
            File newChildDir = new File(newDirPath);
            //如果文件夹不存在,创建文件夹
            if (!newChildDir.exists()) {
                newChildDir.mkdir();
            }

            for (int j = 0; j < batchFileNumber; j++) {
                if (i + j >= files.size()) {
                    break;
                }
                String newFilePath = newDirPath + "/" + files.get(i + j).getName();
                File newFile = new File(newFilePath);
                files.get(i + j).renameTo(newFile);
            }
        }
    }

    /**
     * 查询文件夹下的所有图片文件
     */
    public static List<File> listAllImageFile(File file) {
        List<File> resultList = new ArrayList<>();
        if (file == null || file.listFiles() == null || 0 == file.listFiles().length) {
            return new ArrayList<File>();
        }

        for (File tempFile : file.listFiles()) {
            if (tempFile.isDirectory()) {
                // 递归遍历文件夹
                resultList.addAll(listAllImageFile(tempFile));
            } else {
                if (isImage(tempFile)) {
                    resultList.add(tempFile);
                }
            }
        }
        return resultList;
    }

    /**
     * 判断一个文件是不是图片文件
     */
    public static boolean isImage(File file) {
        if (file == null) {
            return false;
        }

        String fileName = file.getName();
        if (fileName == null || "".equals(fileName)) {
            return false;
        }

        List<String> splitFileNames = Arrays.asList(fileName.split("\\."));
        if (splitFileNames.size() != 2) {
            System.out.println("错误的文件格式,路径" + file.getPath() + " 名称:" + file.getName());
            return false;
        }

        String fileSuffix = splitFileNames.get(1);
        if (fileSuffix.equals("jpg") || fileSuffix.equals("png") | fileSuffix.equals("jpeg")
                || fileSuffix.equals("JPG") || fileSuffix.equals("PNG") || fileSuffix.equals("JPEG")) {
            return true;
        }
        System.out.println("错误的文件格式,路径" + file.getPath() + " 名称:" + file.getName());
        return false;
    }

}

分批次保存如下图所示,测试结果文件夹里有4个子文件夹:

Java递归查询文件下所有的图片,移动到指定文件夹中,分批次建立子文件夹_desktop_05


标签:files,return,file,递归,fileSuffix,文件夹,File,Java
From: https://blog.51cto.com/xuxiangyang/9047888

相关文章

  • 无涯教程-Java 正则 - Matcher reset()函数
    java.util.regex.Matcher.reset()方法重置此匹配器。Matcherreset()-声明publicMatcherreset()Matcherreset()-示例下面的示例显示java.util.regex.Matcher.reset()方法的用法。packagecom.learnfk;importjava.util.regex.Matcher;importjava.util.regex.Pat......
  • 无涯教程-Java 正则 - Matcher int regionStart函数
    java.util.regex.Matcher.regionStart()匹配器区域的起始索引。intregionStart()-声明publicintregionStart()intregionStart()-示例下面的示例显示java.util.regex.Matcher.regionStart()方法的用法。packagecom.learnfk;importjava.util.regex.Matcher;imp......
  • 无涯教程-Java 正则 - String replaceAll(String replacement)函数
    java.util.regex.Matcher.replaceAll(Stringreplacement)方法使用给定的替换字符串替换与该模式匹配的每个子序列。StringreplaceAll-声明publicStringreplaceAll(Stringreplacement)replacement  - 替换字符串。StringreplaceAll-返回值通过用替换字符串替......
  • JavaWebDay10
    开发规范restful表属性状态转换,是一种软件架构风格,注意rest是风格为约定方式可以打破,藐视模块的功能通常使用复数加s,表示此类资源要有一个统一响应数据的格式通常用result实体类来封装当想给参数设置默认值可以使用@requestparam注解后括号接defaultvalue=“1” ......
  • Java 方法
    方法的定义与调用定义:Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法的语法为:修饰符返回值类型方法名(参数类型参数名){ ... 方法体 ... return返回值;}修饰符:可选,告诉编译器如何调用该方法,定义了该方法的访问类型。......
  • 无涯教程-Java 正则 - Matcher static String quoteReplacement(String s)函数
    java.time.Matcher.quoteReplacement(Strings)方法返回指定字符串的文字替换字符串。staticStringquoteReplacement-声明publicstaticStringquoteReplacement(Strings)s  - 要被字符串化的字符串。staticStringquoteReplacement-返回值文字字符串替换。......
  • java的二维数组怎么添加数据
    Java的二维数组怎么添加数据在Java中,二维数组是由多个一维数组组成的,可以看作是一个表格或者矩阵。要向二维数组中添加数据,我们可以使用循环来遍历数组的每个位置,并将数据赋值给对应的元素。创建和初始化二维数组在向二维数组添加数据之前,我们首先需要创建并初始化一个二维数组......
  • java并发调接口
    使用Java并发调接口的步骤流程图flowchartTDStart-->|创建线程池|CreateThreadPoolCreateThreadPool-->|提交任务|SubmitTaskSubmitTask-->|执行任务|ExecuteTaskExecuteTask-->|获取结果|GetResultGetResult-->|处理结果|ProcessResult......
  • java的sleep函数怎么用
    Java中的sleep函数用法sleep()函数是Java中的一个方法,可以使当前线程暂停一段时间,以实现线程的延迟执行。在本文中,我们将详细介绍sleep()函数的用法,并提供一些代码示例和逻辑清晰的解释。1.sleep()函数的语法和参数sleep()函数的语法如下所示:publicstaticvoidsleep(longmi......
  • java标准包
    Java标准包Java是一种广泛使用的编程语言,提供了丰富的标准包(StandardPackages)来支持不同的应用需求。这些标准包包含了许多常用的类和接口,方便开发人员快速构建应用程序。本文将介绍几个常用的Java标准包,并给出代码示例,以帮助读者更好地理解和使用这些包。java.util包java.util......