我如何使用 file.listFiles() 来列出子目录和文件

Posted

技术标签:

【中文标题】我如何使用 file.listFiles() 来列出子目录和文件【英文标题】:How can I use file.listFiles() to list subdirectories and files also 【发布时间】:2017-07-24 08:21:15 【问题描述】:

我使用file.listFile() 列出指定路径中的文件和目录。我使用file.ListFile() 的原因是因为我使用的是基于用户只希望返回目录还是只希望文件的 FileFilter。但是我得到的结果是它只列出了指定路径中的文件夹和文件,而不是子文件夹和文件。这就是我现在正在使用的:

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;
    
  ));

我只是不确定如何处理所涉及的过滤器

【问题讨论】:

【参考方案1】:

File#listFiles() 的文档没有说明它遍历所有子目录。所以,你需要自己做。对于从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);
            
        
    

【讨论】:

不将过滤器内联,将其设为外部函数并使用 FileFilter 函数作为参数调用 listFiles() 会更容易吗? 这并不能帮助您遍历所有子目录。查看我的编辑。 我使用列表的唯一问题是,当我使用results.setListData() 时,它需要File[] 而不是列表。 您可以轻松地将数组转换为列表,反之亦然:docs.oracle.com/javase/8/docs/api/java/util/List.html#toArray【参考方案2】:

我发现所有带有子目录的 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();
             ...
         

【讨论】:

以上是关于我如何使用 file.listFiles() 来列出子目录和文件的主要内容,如果未能解决你的问题,请参考以下文章

将 File.listFiles 与 FileNameExtensionFilter 一起使用

如何在 Java 7 中用 nio 替换 File.listFiles(FileFilter filter)?

File.listFiles() 使用 JDK 6 破坏 unicode 名称(Unicode 规范化问题)

File.list() 与 File.listFiles()

file.listFiles()按文件大小名称日期排序方法

java file.listFiles()按文件名称日期大小排序