使用Java编写一个文件批量重命名工具

2024-12-30 15:50

本文主要是介绍使用Java编写一个文件批量重命名工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...

背景

在开发移动应用时,UI设计通常会提供不同China编程分辨率的图片资源来适配多种屏幕尺寸。例如,在一个特定的应用场景中,seekbar范围0-64对应64张图片,用于滑动切换不同的颜色背景。设计师提供了"xhdpi", "xxhdpi", "xxxhdpi"三种不同尺寸的图片集,总共192张图片。手动为这些图片添加前缀或进行其他格式化操作既耗时又容易出错。因此,为了提高效率并减少人为错误,这里编写了一个Java工具类FileRenamer,用以自动化这个过程。

处理

1. 文件夹检查与遍历

首先,FileRenamer类定义了新文件名的前缀和源文件夹路径。然后通过rename()方法获取指定路径下的文件夹对象,并验证其有效性。接下来,它遍历预设的子文件夹(如"xhdpi", "xxhdpi", "xxxhdpi"),对每个存在的子文件夹调用processSubFolder()方法进行进一步处理。

2. 批量重命名

processSubFolder()方法中,程序筛选出所有.png文件,并使用正则表达式匹配文件名中的数字和颜色值。根据匹配结果构造新的文件名,将原有的数字部分保留下来,同时将文件名更改为带有指定前缀的形式,如从0_color_ffff00.pngic_wangyou_color0_ffffff.png。成功重命名后,程序会输出确认信息;若失败,则记录下错误。

3. 输出配置代码片段

最后,outputCodeSnippet()方法负责生成一段可以复制粘贴到工程配置中的代码片段。该方法先过滤并排序符合新前缀的所有PNG文件,然后构造包含这些文件引用的字符串。此外,它还会列出未被包含的文件,以便开发者检查是否有遗漏。

完整代码

通过上述步骤,FileRenamer实现了批量重命名图片文件的功能,并自动生成了配置代码片段,极大地简化了资源管理的工作量。以下是该工具类的完整源码:

package com.wang.you.util;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class FileRenamer {

    private static final String NEW_PREFIX = "ic_wangyou_color";
    private static final String FOLDER_PATH = "/storage/emulated/0/wangyou";

    public static void rename() {
        File folder = new File(FOLDER_PATH);
        if (!folder.exists() || !folder.isDirectory()) {
            System.out.println("指定的路径不是一个有效的文件夹!");
            return;
        }

        String[] subFolders = {"xhdpi", "xxhdpi", "xxxhdpi"};

        for (String subFolderName : subFolders) {
            File subFolder = new File(folder, subFolderName);
            if (subFolder.exists() && subFolder.isDirectory()) {
                processSubFolder(subFolder);
            } else {
                System.out.println("子文件夹 " + subFolderName + " 不存在或不是一个有效的文件夹!");
            }
        }
    }

    private static void processSubFolder(File subFolder) {
        File[] files = subFolder.listFiles((dir, name) -> name.toLowerCase().endsWith(".png"));
        if (files == null || files.length == 0) {
            System.out.println("在文件夹 " + subFolder.getName() + " 中没有找到任何 .png 文件!");
            return;
        }

        for (File oldFile : files) {
            String oldFileName = oldFile.getName();
            Pattern pattern = Pattern.compile("(\\d+)_(\\w+\\.png)");
            Matcher matcher = pattern.matcher(oldFileName)编程;

            if (matcher.matches()) {
                String numberPart = matcher.group(1);
                String colorValueWithExt = matcher.group(2);
                String colorValue = colorValueWithExt.split("\\.")[0];

                String newFileName = NEW_PREFIX + numberPart + "_" + colorValue + ".png";
                File newFile = new File(subFolder, newFileName);

                if (oldFile.renameTo(newFile)) {
                    System.out.println("Renamed: " + oldFileName + " -> " + newFileName);
                } else {
                    System.out.println("Failed to rename: " + oldFileName);
                }
            } else {
                System.out.println("Invalid file name format: " + oldFileName);
            }
        }

        outputCodeSnippet(subFolder);
    }

    private static void outputCodeSnippet(File folder) {
        Pattern pattern = Pattern.compile("(?<=color)(\\d+)(?=_)");

        List<File> allPngFiles = Arrays.stream(folder.listFiles())
                .filter(file -> file.getName().toLowerCase().endsWith(".png"))
                .collect(Collectors.toList());

        List<File> renamedFiles = allPngFiles.stream()
                .filter(file -> file.getName().startsWith(NEW_PREFIX))
                .sorted((f1, f2) -> {
                    Matcher m1 = pattern.matcher(f1.getName());
                    Matcher m2 = pattern.matcher(f2.getName());
                    if (m1.find() && m2.find()) {
                        return Integer.compare(Integer.parseInt(m1.group()), Integer.parseInt(m2.group()));
                    }
                    return 0;
                })
                .collect(Collectors.toList());

        System.out.println("准备输出字符串renamedFiles: " + renamedFiles.size());

        StringBuilder outputString = new StringBuilder("private final int[] wangyou_colorArr_" + folder.getName(http://www.chinasem.cn) + " = new int[]{\n");

        for (File file : renamedFiles) {
            String fileNameWithoutExtension = file.getName().replaceFirst("[.][^.]+$", "");
            outputString.append("            R.mipmap.")
                    .append(fileNameWithoutExtensionjavascript)
                    .append(",\n");
        }

        if (outputString.toString().endsWith(",\n")) {
            outputString.setLength(outputString.length() - 2);
        }
        outputString.append("\n};");

        System.out.println(outputString.toString());

        List<File> unmatchedFiles = allPngFiles.stream()
                .filter(file -> !file.getName().startsWith(NEW_PREFIX))
                .collect(CollectoSHZvicKrs.toList());

        if (!unmatchedFiles.isEmpty()) {
            System.out.println("以下文件未被包含:");
            unmatchedFiles.forEach(file -> System.out.println("    " + file.getName()));
        }
    }
}

这段代码不仅解决了大批量图片文件的重命名问题,还自动生成了对应的资源数组,使得能够轻松地在项目中集成这些资源。这里只是一个示例,当然啦,实际使用要根据不同的文件名称去处理,照搬肯定是不行的

到此这篇关于使用Java编写一个文件批量重命名工具的文章就介绍到这了,更多相关Java文件批量重命名内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于使用Java编写一个文件批量重命名工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1152846

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置