Java 如何使用file.listFiles()同时列出子目录和文件

Java 如何使用file.listFiles()同时列出子目录和文件,java,subdirectory,filelist,filefilter,Java,Subdirectory,Filelist,Filefilter,我正在使用file.listFile()列出指定路径中的文件和目录。我之所以使用file.ListFile()是因为我使用的文件过滤器基于用户是只希望返回目录还是只希望返回文件。但结果是,它只列出指定路径中的文件夹和文件,而不列出子文件夹和文件。这就是我现在正在处理的问题: file = new File(directory.getText().trim()); // Used this for testing; ListFiles() is a method File[] test = Li

我正在使用
file.listFile()
列出指定路径中的文件和目录。我之所以使用
file.ListFile()
是因为我使用的文件过滤器基于用户是只希望返回目录还是只希望返回文件。但结果是,它只列出指定路径中的文件夹和文件,而不列出子文件夹和文件。这就是我现在正在处理的问题:

file = new File(directory.getText().trim());

// Used this for testing; ListFiles() is a method
File[] test = ListFiles(directory.getName()); //  I made up that will list the subfolders and files.
results.setListData(test); // Also for testing. results is a JList

// This is what i previously had that only lists folders and file in that directory
results.setListData(file.listFiles(new Filter() {
  public boolean accept(File file) {
    if (directories.isSelected()) {
      // Directories checkBox
      if (files.isSelected()) {
        // Files checkBox
        // FILES && DIRECTORIES
        return (file.isDirectory() || file.isFile()) && (StringUtils.contains(file.getName(), userInput.getText().trim()));
      }
      // DIRECTORIES
      return (file.isDirectory()) && (StringUtils.contains(file.getName(), userInput.getText().trim()));
      } else {
        if (files.isSelected()) {
          // FILES
          return (file.isFile()) && (StringUtils.contains(file.getName(), userInput.getText().trim()));
        }
      }
      return true;
    }
  }));
}
我只是不知道如何使用所涉及的过滤器

的文档并没有说明它遍历所有子目录。所以,你需要自己去做。对于从
listFiles()
返回的每个目录,需要对其递归调用
listFiles()

您可以在筛选器中执行此操作,只要您在另一个结构中收集所有文件,因为您无法单独使用筛选器向结果中添加更多文件。我不建议你这么做

您最好放弃使用过滤器并执行以下操作:

List<File> files = new ArrayList<>();

public void getFiles(File file) {
    for (File file : file.listFiles()) {
        if (file.isDirectory()) {
            if (collectDirectories) {
                files.add(file);
            }
            getFiles(file);
        } else {
            if (collectFiles) {
                files.add(file);
            }
        }
    }
}
List files=new ArrayList();
公共void getFiles(文件){
对于(文件:File.listFiles()){
if(file.isDirectory()){
如果(收集目录){
文件。添加(文件);
}
获取文件(文件);
}否则{
如果(收集文件){
文件。添加(文件);
}
}
}
}

我发现所有带有子目录的FileNameFilter内容都有点复杂。 我现在用这个:

  <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
        <type>jar</type>
   </dependency>

   File inputDir = new File(inputPath.toString());
   Iterator<File> matchesIterator = FileUtils.iterateFiles(
            inputDir, new WildcardFileFilter("somefilenamefilter*.xml"), TrueFileFilter.TRUE);
        while (matchesIterator.hasNext()) {
            File someFile = matchesIterator .next();
             ...
        } 

org.apache.commons
公地io
1.3.2
罐子
File inputDir=新文件(inputPath.toString());
迭代器匹配迭代器=FileUtils.iterateFiles(
inputDir,新的通配符文件过滤器(“somefilenamefilter*.xml”),TrueFileFilter.TRUE);
while(matchesIterator.hasNext()){
File someFile=matchesIterator.next();
...
} 

如果不将过滤器内联,将其设为外部函数,并使用FileFilter函数作为参数调用
listFiles()
,会更容易吗?这无助于遍历所有子目录。请参阅我的编辑。使用列表时唯一的问题是,当我使用
results.setListData()
时,它需要的是
文件[]
而不是列表。您可以轻松地将数组转换为列表,反之亦然: