基于Java的高效文件批量重命名工具

基于Java实现高效的文件批量重命名功能

在日常开发或工作中,经常需要批量处理文件,例如将一大批杂乱无章命名的文件,按照规则重命名以便整理和查找。在本文中,我们将实现一个基于Java的高效文件批量重命名工具,支持灵活的命名规则和多种扩展功能。

需求分析

  1. 多规则支持:能够根据用户自定义格式对文件进行重命名,例如添加前缀、后缀、递增编号等。
  2. 文件类型过滤:支持只处理特定文件类型(如仅重命名 .txt 文件)。
  3. 递归子目录处理:支持递归遍历文件夹层级,处理所有子文件夹下的目标文件。
  4. 异常处理:提供对重复命名、空文件夹、无效路径等问题的处理机制。
  5. 简单易用:使用配置文件或命令行参数设置规则,提升灵活性。

技术方案

目录遍历和文件操作

使用 Java 提供的 java.nio.file 包可以高效实现文件的遍历与修改:

  • Files.walk() 方法用于递归遍历子目录中的文件。
  • 使用 Path 对象代表文件路径,利用 Files.move() 方法实现文件名的变更。

重命名逻辑设计

  • 提供接口让用户输入命名规则,例如 "文件_编号_递增", 提供占位符 {index} 和 {timestamp}。
  • 使用 String.format() 方法动态生成新的文件名。
  • 利用正则表达式或尾缀匹配完成文件类型过滤。

用户交互

  • 阅读命令行参数获取用户输入,例如目标路径、命名规则、文件类型。
  • 提供一个简单的配置文件解析逻辑(如 .properties)。

多线程优化

对于文件数目较多的场景,使用 ExecutorService 线程池,实现对不同文件夹的并发处理。

核心代码实现

以下是实现文件批量重命名的关键代码片段:

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.*;
import java.util.regex.Pattern;

public class BatchFileRenamer {

    public static void main(String[] args) {
        // 示例输入:目标文件夹路径
        String targetDir = "C:/exampleFolder";
        String fileFilter = ".txt"; // 要处理的文件类型
        String rule = "File_{index}_{timestamp}"; // 命名规则

        try {
            FileProcessor.renameFiles(targetDir, fileFilter, rule);
        } catch (IOException e) {
            System.err.println("操作失败: " + e.getMessage());
        }
    }
}

class FileProcessor {
    // 线程池
    private static final ExecutorService executor = Executors.newFixedThreadPool(4);

    public static void renameFiles(String targetDir, String fileFilter, String rule) throws IOException {
        Path startPath = Paths.get(targetDir);

        Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
            int counter = 1; // 初始编号
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                if (file.toString().endsWith(fileFilter)) {
                    // 交由线程池处理
                    executor.submit(() -> {
                        try {
                            String newFileName = generateFileName(rule, counter++);
                            Path newFilePath = file.resolveSibling(newFileName);
                            Files.move(file, newFilePath, StandardCopyOption.REPLACE_EXISTING);
                            System.out.println("Renamed: " + file.getFileName() + " -> " + newFileName);
                        } catch (Exception e) {
                            System.err.println("重命名错误: " + e.getMessage());
                        }
                    });
                }
                return FileVisitResult.CONTINUE;
            }
        });

        executor.shutdown();
        try {
            executor.awaitTermination(1, TimeUnit.HOURS);
        } catch (InterruptedException e) {
            System.err.println("线程中断: " + e.getMessage());
        }
    }

    private static String generateFileName(String rule, int index) {
        String timestamp = String.valueOf(System.currentTimeMillis());
        return rule.replace("{index}", String.valueOf(index)).replace("{timestamp}", timestamp);
    }
}

功能解析

  1. 规则解析与生成新名称:调用 generateFileName(),将命名规则中的占位符动态替换为编号和时间戳。
  2. 多线程优化:使用线程池并发处理多个文件,提升效率。
  3. 文件过滤与递归处理:通过文件扩展名匹配以及 Files.walkFileTree() 实现递归遍历,并过滤目标文件类型。

测试与结果

  1. 在一个包含 1000 个 txt 文件的文件夹中应用工具,文件名成功被格式化为 File_1_{timestamp}.txt 等。
  2. 对嵌套子目录中的目标文件测试,能够正确处理。
  3. 使用非 txt 类型文件校验,未被错误处理。

优化方向

  1. 增加 UI 界面以便非技术用户操作。
  2. 支持更多命名规则(如日期格式和大小写切换)。
  3. 添加日志记录功能,用于存储处理结果。

总结

通过 Java.nio.file 提供的强大 API 和合理的多线程设计,我们高效实现了一个文件批量重命名工具。该工具扩展性强,便于二次开发,可以广泛应用于文件管理、数据清洗等场景。