【问题标题】:How can I use file.listFiles() to list subdirectories and files also我如何使用 file.listFiles() 来列出子目录和文件
【发布时间】: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;
    }
  }));
}

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

【问题讨论】:

    标签: java subdirectory filelist filefilter


    【解决方案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();
                 ...
            } 
    

    【讨论】:

      猜你喜欢
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 2019-07-06
      • 2014-09-12
      • 1970-01-01
      • 2016-01-16
      相关资源
      最近更新 更多