You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java遍历目录问题:查找并移动目录及子目录下所有TXT文件

解决Java中遍历目录及所有嵌套子目录获取全部TXT文件并移动的问题

嘿,我来帮你搞定这个问题!你遇到的情况应该是原代码的遍历逻辑没处理好父目录的文件,而且递归收集的时候漏了层级对吧?下面给你两种靠谱的解决方案,不管是手写递归还是用Java自带的工具类都能搞定:

方法一:递归遍历目录(兼容所有Java版本)

这个方法的核心思路是:先收集当前目录下的所有TXT文件,再递归处理每个子目录,把子目录里的文件也统一加入列表,这样就能拿到所有层级的文件了。

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;

public class FilesFindingInDirectory {
    // 递归收集所有TXT文件
    private static List<File> getAllTxtFiles(File directory) {
        List<File> txtFiles = new ArrayList<>();
        
        File[] files = directory.listFiles();
        if (files != null) {
            for (File file : files) {
                // 先处理当前目录下的TXT文件
                if (file.isFile() && file.getName().toLowerCase().endsWith(".txt")) {
                    txtFiles.add(file);
                }
                // 递归处理子目录,把子目录的文件也加入列表
                else if (file.isDirectory()) {
                    txtFiles.addAll(getAllTxtFiles(file));
                }
            }
        }
        return txtFiles;
    }

    // 批量移动文件
    private static void moveFiles(List<File> files, String targetDir) throws IOException {
        File targetDirectory = new File(targetDir);
        // 目标目录不存在就创建
        if (!targetDirectory.exists()) {
            targetDirectory.mkdirs();
        }

        for (File file : files) {
            Path sourcePath = file.toPath();
            Path targetPath = Paths.get(targetDir, file.getName());
            // 移动文件,可选覆盖同名文件
            Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
            System.out.println("已移动: " + file.getAbsolutePath() + " -> " + targetPath);
        }
    }

    public static void main(String[] args) {
        // 替换成你的源目录和目标目录路径
        String sourceDir = "/path/to/source";
        String targetDir = "/path/to/target";

        try {
            List<File> allTxtFiles = getAllTxtFiles(new File(sourceDir));
            moveFiles(allTxtFiles, targetDir);
            System.out.println("全部完成!共处理 " + allTxtFiles.size() + " 个TXT文件");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

方法二:用Java NIO的Files.walk(Java 8+ 推荐)

如果你用的是Java 8及以上版本,推荐用这个方法,代码更简洁,不用自己写递归,Files.walk会自动遍历所有嵌套子目录:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.stream.Collectors;

public class FilesFindingInDirectory {
    public static void main(String[] args) {
        // 替换成你的路径
        String sourceDir = "/path/to/source";
        String targetDir = "/path/to/target";
        Path targetPath = Paths.get(targetDir);

        try {
            // 创建目标目录(包括父目录)
            Files.createDirectories(targetPath);

            // 遍历所有层级,筛选TXT文件
            List<Path> txtFiles = Files.walk(Paths.get(sourceDir))
                    .filter(Files::isRegularFile) // 只处理文件
                    .filter(path -> path.getFileName().toString().toLowerCase().endsWith(".txt")) // 筛选TXT
                    .collect(Collectors.toList());

            // 逐个移动文件
            for (Path source : txtFiles) {
                Path dest = targetPath.resolve(source.getFileName());
                Files.move(source, dest, StandardCopyOption.REPLACE_EXISTING);
                System.out.println("已移动: " + source + " -> " + dest);
            }

            System.out.println("移动完成!共处理 " + txtFiles.size() + " 个文件");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

一些需要注意的细节

  • 权限问题:确保你的程序有源目录的读取权限和目标目录的写入权限,否则会抛出IO异常
  • 同名文件:代码里用了StandardCopyOption.REPLACE_EXISTING,如果目标目录有同名文件会被覆盖。如果不想覆盖,可以在移动前判断Files.exists(dest),然后给文件重命名(比如加个时间戳后缀)
  • 异常处理:示例里用了简单的printStackTrace,实际项目中可以更精细地处理,比如某个文件移动失败时跳过它,继续处理其他文件

内容的提问来源于stack exchange,提问作者Aishu

火山引擎 最新活动