使用java递归深度优先遍历文件系统

使用java递归深度优先遍历文件系统,java,recursion,filesystems,Java,Recursion,Filesystems,我需要用java遍历一个随机文件系统(windows) 问题是:它需要自下而上,因为我将数据合并在一起,根目录应该包含我的所有数据集 这就是我到目前为止的情况: private void listDir(File dir) { File[] files = dir.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { System.out.

我需要用java遍历一个随机文件系统(windows)

问题是:它需要自下而上,因为我将数据合并在一起,根目录应该包含我的所有数据集

这就是我到目前为止的情况:

private void listDir(File dir) {
    File[] files = dir.listFiles();
    if (files != null) {
        for (int i = 0; i < files.length; i++) {
            System.out.print(files[i].getAbsolutePath());
            if (files[i].isDirectory()) {
                System.out.print(" (Directory)\n");
                listDir(files[i]);  //Recursion
            }
            else {
                System.out.print(" (File)\n");
            }
        }
    }
}
private void listDir(文件目录){
File[]files=dir.listFiles();
如果(文件!=null){
对于(int i=0;i
那么,有没有办法实现这一点


非常感谢您的帮助,希望我的问题不会打扰您^ ^

对于每个目录,您可以先处理子目录,然后处理目录中的文件

private void listDir(File dir) {
    File[] files = dir.listFiles();
    if (files != null) {
        for (int i = 0; i < files.length; i++) { // Directories
            if (files[i].isDirectory()) {
                System.out.print(" (Directory)\n");
                listDir(files[i]); //Recursion
            }
        }
        for (int i = 0; i < files.length; i++) { // Files
            if (!files[i].isDirectory()) {
                System.out.print(" (File)\n");
            }
        }
    }
}
private void listDir(文件目录){
File[]files=dir.listFiles();
如果(文件!=null){
对于(inti=0;i
也许你想要这样的东西:

private int countFiles(File dir) {
    int res = 0;
    if (files != null) {
        for (int i = 0; i < files.length; i++) { // Files
            if (!files[i].isDirectory()) {
                System.out.print(" (File)\n");
                res++;
            }
        }
    }
    return res;
}
private int countFilesDeep(File dir) {
    File[] files = dir.listFiles();
    int res = 0;
    if (files != null) {
        for (int i = 0; i < files.length; i++) { // Directories
            if (files[i].isDirectory()) {
                System.out.print(" (Directory)\n");
                res += countFilesDeep(files[i]); //Recursion
            }
        }
    }
    res += countFiles(dir);
    return res;
}
private int countFiles(文件目录){
int res=0;
如果(文件!=null){
对于(int i=0;i
通常,使用深度优先树递归,您可以通过更改输出语句和递归调用的顺序来影响输出的顺序

以这棵树为例:

        1
       / \
      2   3
     / \   \
    4   5   6
如果我的代码是(此答案中的所有代码都是伪代码):

。。。然后它将输出
1 2 4 5 3 6
——按照您头脑中的逻辑,验证这是真的

如果我只更改语句的顺序:

 void f(Node node) {
      if(node == null) return;
      f(node.left);
      print node.value;
      f(node.right);
 }
现在它将打印
4 2 5 1 3 6
——再次按照逻辑进行操作并验证其正确性

 void f(Node node) {
      if(node == null) return;
      f(node.left);
      f(node.right);
      print node.value;
 }
。。。打印
4 5 2 6 3 1
——这可能是您想要的

您可能需要一个广度优先遍历,并且您可能希望颠倒输出的顺序-Google中有一些示例

在一个文件系统中,子文件的数量不仅仅是左和右,所以它更像:

 void recursiveList(File f) { // f could be a file or a directory
      if(f is a file) {
           output file info about f
           return
      }
      // else it's a directory
      for(File entry : f.getChildren()) {
          recursiveList(entry);
      }
      output directory info about f
  }
所以我写了这个:

 public void walkFilesystem(File f)
{

    File[] arr= f.listFiles();
    if(arr.length>0) //-> against nullPointer
    {
        for(File file : arr)
        {
            if(file.isDirectory())
            {
                System.out.println(file.getAbsolutePath()+" (Directory)");
                walkFilesystem(file);
            }
            else if(file.isFile()&&file.getPath().contains("txt"))
            {
                System.out.println(file.getAbsolutePath()+" (node)");
            }
        }
    }

}

那应该有用,不是吗

你应该能够使用一个。在方法中进行合并。你必须更具体地说明“自下而上行走”对你意味着什么。你是在看反向深度优先合并,还是宽度优先?给出一个树上的例子..这正是我想要的,所以它是深度优先树递归非常好的回答,我将用java编写代码,明天在这里分享。感谢您的时间和知识(slim:),但我如何知道文件系统中哪个节点在左侧,哪个节点在右侧?按字母顺序比较?按listFiles()的顺序?我添加了一些相关内容。@malle这正是我在推荐中链接的方法所做的。这不是答案。然而,最好的方法是运行它,如果你给它传递一个目录,就会抛出一个nullPointerException,因为arr是空的。如果知道该文件是目录,则只需调用listFiles()。嗯,它不会抛出空指针。。。我的意思是,我是否能理解它:if(arr.length>0)?我明白它为什么有效了:你永远不会传递一个非目录。if(arr.length>0)将抛出NPE,因为它将尝试计算
null.length
,如果您已经用希望它使用的每个输入场景对它进行了测试,并且它生成了您想要的输出,那么它就工作了。
 public void walkFilesystem(File f)
{

    File[] arr= f.listFiles();
    if(arr.length>0) //-> against nullPointer
    {
        for(File file : arr)
        {
            if(file.isDirectory())
            {
                System.out.println(file.getAbsolutePath()+" (Directory)");
                walkFilesystem(file);
            }
            else if(file.isFile()&&file.getPath().contains("txt"))
            {
                System.out.println(file.getAbsolutePath()+" (node)");
            }
        }
    }

}