Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中获取目录及其子目录中所有文件的非递归方法_Java_File_Directory_Subdirectory - Fatal编程技术网

Java中获取目录及其子目录中所有文件的非递归方法

Java中获取目录及其子目录中所有文件的非递归方法,java,file,directory,subdirectory,Java,File,Directory,Subdirectory,我试图获得一个目录及其子目录中所有文件的列表。我目前的递归方法如下: private void printFiles(File dir) { for (File child : dir.listFiles()) { if (child.isDirectory()) { printFiles(child); } else if (child.isFile()) { System.out.println(child.getPath()); }

我试图获得一个目录及其子目录中所有文件的列表。我目前的递归方法如下:

private void printFiles(File dir) {
  for (File child : dir.listFiles()) {
    if (child.isDirectory()) {
      printFiles(child);
    } else if (child.isFile()) {
      System.out.println(child.getPath());
    }
  }
}

printFiles(new File("somedir/somedir2"));
然而,我希望有一种非递归的方法(可能是现有的API调用)来实现这一点。如果不是,这是最干净的方法吗?

可能是最好的方法。(有关问题的副本) 仅发布,以便搜索此内容的人可以看到它,并且可能不会阅读评论


编辑:要使用的方法Listfiles

您始终可以使用堆栈(对于DFS)或队列(对于BFS)将递归解决方案替换为迭代解决方案:

private void打印文件(文件目录){
堆栈=新堆栈();
堆栈推送(dir);
而(!stack.isEmpty()){
File child=stack.pop();
if(child.isDirectory()){
对于(文件f:child.listFiles())stack.push(f);
}else if(child.isFile()){
System.out.println(child.getPath());
}
}
}
打印文件(新文件(“abc/def.ghi”);

Java8之后,您可以使用以递归方式列出给定目录中的所有文件和目录。此外,如果您只需要常规文件,则可以应用类似于
Files::isRegularFile
的过滤器来筛选出目录


另一方面,如果您只需要列出给定的目录,而不需要列出其子目录,则可以使用lazy方法,该方法将只提供给定目录中的文件和目录。您可以再次进一步应用上述过滤器

可能的副本。标题是递归的,但第一个答案是库调用。@cularis不是重复的,因为我试图以非递归的方式进行,而另一个问题是要求递归地进行。递归有什么问题?这方面没有API,但是你仍然可以通过
while
循环和一些有趣的其他业务来完成,但它会很混乱。@Kshitij在回答之前阅读了完整的评论和答案。无论哪种方式,我都相信这个问题对社区有价值,因为搜索它的人乍一看会忽略其他问题(和我一样)由于标题Maybe,我遗漏了一些东西,但我在查看FileUtils文档时,在构造函数下面有一条注释说“实例不应该在标准编程中构造。”是的..实例…你应该使用它们提供的静态方法。(顺便说一句,它们几乎都是静态的)遇到了另一个问题;Eclipse无法识别FileUtils类。我应该导入哪个包?啊,看起来我根本无法使用它。我没有安装其他库的选项。但无论如何,谢谢!这是学校分布式文件系统作业的一部分,并且将测试代码的机器没有安装了apache commons library。有时我不喜欢Eclipse启动所需的时间。做得好。我很惊讶为什么一些工程师会想为什么递归可能不好,为什么使用堆栈会很混乱。堆栈方法看起来比递归方法好,谢谢!堆栈方法如何更好?当然可能是稍微快一点,但递归非常简单和优雅。在内部,递归使用堆栈。速度和递归必须存储整个函数的状态这两个事实(在我的问题中,为了发布它,已将其剥离)在堆栈上,而使用这种方法,我只在堆栈上保存文件对象。这很完美,我们可以将其限制为深度2或5…比如一些不超过该深度的数字。
private void printFiles(File dir) {
  Stack<File> stack = new Stack<File>();
  stack.push(dir);
  while(!stack.isEmpty()) {
    File child = stack.pop();
    if (child.isDirectory()) {
      for(File f : child.listFiles()) stack.push(f);
    } else if (child.isFile()) {
      System.out.println(child.getPath());
    }
  }
}

printFiles(new File("abc/def.ghi"));