【问题标题】:How to filter folders(Directories and Sub-Dir) based on specific file's extension in java..?如何根据 java.. 中特定文件的扩展名过滤文件夹(目录和子目录)?
【发布时间】:2020-11-01 23:52:10
【问题描述】:

好的,我读了很多东西,但我没有弄清楚如何根据文件扩展名过滤文件夹(目录和子目录),例如我想要只包含的文件夹列表(目录和子目录) “.mp3”或“.mp4”文件,我不想使用 Walk.Tree,如果有任何可能的方式通过“filenameFilter”或除 Walk.tree 方法之外的任何其他方式。

这是我迄今为止尝试过的代码,没有错误,但也没有过滤特定文件的文件夹。它显示了所有文件夹。

提前致谢。

  File[] ff = f.listFiles(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                    return name.toLowerCase().endsWith(".mp3") || new File(dir.toPath().toString(),name).isDirectory();
                }

            });

【问题讨论】:

  • 好的。如果是目录结构: dir1-dir11-a.mp3, dir1-dir12-b.txt ,你要输出什么?
  • 我想要只包含 mp3 文件的目录,例如,如果 dir11、dir12 包含 mp3 文件而其他目录不包含,那么我只想要 dir11、dir12。
  • 是的,但在我的例子中。你想要的输出是什么?仅 dir11 或同时 dir1 和 dir11
  • 是 dir1 和 dir11 如果 dir1 是父子 dir2345678910, dir11
  • 您需要按层次顺序排列这些名称还是只需要一组文件夹名称?

标签: java file filter directory


【解决方案1】:

这是一个简单的控制台应用程序。

算法是这样的:

  1. 首先从指定的根文件夹递归搜索所有带有 mp3 扩展名的文件,并不断将它们添加到列表中。
  2. 如果此列表恰好为空,则返回。
  3. 否则,对于这些 mp3 文件中的每一个,递归地查找它们的父文件夹,直到您到达根文件夹并继续将这些父文件夹存储在一个集合中以避免重复搜索。
  4. 现在打印出从根目录开始的所有有效文件夹。
public class MyApp {

  public static void main(String[] args) {

    File rootDir = new File("src/main/resources/dir1");
    List<File> filesListWithValidExtension = new ArrayList<>();
    recursiveSearch(rootDir, filesListWithValidExtension);

    if (filesListWithValidExtension.size() == 0) {
      System.out.println("Specified root directory has no file with mp3 extension");
      return;
    }

    Set<File> requiredFolders = new HashSet<>();
    for (File fileWithValidExtension : filesListWithValidExtension) {
      File parent;
      do {
        parent = fileWithValidExtension.getParentFile();
        if (requiredFolders.contains(parent)) {
          break;
        } else {
          requiredFolders.add(parent);
          fileWithValidExtension = parent;
        }
      }
      while (!parent.getPath().equals(rootDir.getPath()));
    }

    System.out.println("Printing folders (from root) containing mp3 files");
    recursivePrint(rootDir, requiredFolders);

  }

  private static void recursiveSearch(File file, List<File> filesListWithvalidExtension) {
    if (!file.exists()) {
      return;
    }
    if (file.isDirectory()) {
      for (File f : file.listFiles()) {
        recursiveSearch(f, filesListWithvalidExtension);
      }
    }
    if (file.getName().toLowerCase().endsWith(".mp3")) {
      filesListWithvalidExtension.add(file);
    }
  }

  private static void recursivePrint(File file, Set<File> requiredFolders) {
    if (!requiredFolders.contains(file)) {
      return;
    }
    System.out.println(file.getPath());

    for (File f : file.listFiles()) {
      recursivePrint(f, requiredFolders);
    }

  }

}

这个程序输出如下:

Printing folders (from root) containing mp3 files
src/main/resources/dir1
src/main/resources/dir1/dir12
src/main/resources/dir1/dir11
src/main/resources/dir1/dir11/dir111

【讨论】:

  • 我试过了,但是堆栈溢出说“感谢您的反馈!声望低于 15 的人的投票会被记录下来,但不要更改公开显示的帖子得分。”
  • 哦,没关系。非常感谢
  • 顺便说一句,我是新来的,再次感谢您的宝贵时间。
  • 乐于助人 :-)
猜你喜欢
  • 1970-01-01
  • 2016-03-20
  • 2017-05-09
  • 2011-09-09
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2013-07-24
相关资源
最近更新 更多