Java - 遍历目录中的所有文件

标签 java file recursion

我想找到目录和嵌套子目录中的所有 txt 文件。如果找到,我想将其从一个位置移动到另一个位置。

如果我没有任何嵌套的子目录,下面的代码可以正常工作。

下面代码的问题是,一旦它找到嵌套目录,它只从那个特定的嵌套子目录返回文件。 但我想要我的目录(父目录及其嵌套子目录)中的所有 txt 文件。

public class FilesFindingInDirectory {
    static ArrayList<File> al = new ArrayList<File>();
    static File fileLocation = null;
    public static void main(String[] args) throws IOException {


        File filePath = new File("C:\\Users\\Downloads");

        File[] listingAllFiles = filePath.listFiles();

        ArrayList<File> allFiles = iterateOverFiles(listingAllFiles);


                for (File file : allFiles) {
                    if(file != null) {
                        String fileName = file.getName();

                        String sourceFilepath = file.getAbsolutePath();
                        File targetFilePath = new File("D:\\TestFiles");
                        String targetPath = targetFilePath.getPath();

                        Files.move(Paths.get(sourceFilepath), Paths.get("D:\\TestFiles\\" + fileName)); 
                    }

                }
            }


public static ArrayList<File> iterateOverFiles(File[] files) {


        for (File file : files) {

            if (file.isDirectory()) {

                iterateOverFiles(file.listFiles());// Calls same method again.

            } else {

                fileLocation = findFileswithTxtExtension(file);
                if(fileLocation != null) {
                    System.out.println(fileLocation);
                    al.add(fileLocation);
                }


            }
        }

        return al;
    }

public static File findFileswithTxtExtension(File file) {

        if(file.getName().toLowerCase().endsWith("txt")) {
            return file;
        }

        return null;
    }
}

最佳答案

您已经在使用 nio Files API 来移动文件,为什么不使用它来遍历文件呢?

 List<Path> txtFiles = Files.walk(Paths.get("C:\\Users\\Downloads"))
                            //use to string here, otherwise checking for path segments
                            .filter(p -> p.toString().endsWith(".txt"))
                            .collect(Collectors.toList());

如果您不需要那个中间列表,您也可以在 foreach 终端操作中运行您的移动操作

Files.walk(Paths.get("C:\\Users\\Downloads"))
     .filter(p -> p.toString().endsWith(".txt"))
     .forEach(p -> {
        try {
            Files.move(p, Paths.get("D:\\TestFiles", p.getFileName().toString()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    });

关于Java - 遍历目录中的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49834725/

相关文章:

file - 具有可变记录长度的 Cobol 索引文件

php - 在 PHP 中删除所有早于 2 天的文件的正确方法

python - 在Python 2.7中通过递归添加数字来将数字压缩为一位数字的程序中得到错误的总和

python - 将分而治之递归算法转换为迭代版本

c - 在 C 中递归地反转多个用户输入

java - 未找到 Hibernate 逆向工程持久性单元

file - 从文件中读取 Common Lisp

java - 贬低或放弃多态性 - 较小的罪恶是什么?

java - JUnit 测试 - 我做错了什么

java - 如何跳过扩展抽象类的类中的一个方法?