【问题标题】:How do I find/list a file or directory with specific name inside a directory and its subdirectories in Java?如何在 Java 中的目录及其子目录中查找/列出具有特定名称的文件或目录?
【发布时间】:2015-06-03 21:52:42
【问题描述】:

我在 Linux (Redhat) 上的文件/目录树是什么样子的。

/search
├───sub1
│   └───data (directory)
└───sub2
    └───data (file)

下面列出了我已经尝试过的。

示例 I(我假设目录是 Linux 中的文件,Java 知道这一点)

FileUtils.listFiles(new File("/search"),
                        new NameFileFilter("data"), TrueFileFilter.INSTANCE)
                        .forEach(System.out::println);

例二

FileUtils.listFilesAndDirectories(new File("/search"),
                        new NameFileFilter("data"), TrueFileFilter.INSTANCE)
                        .forEach(System.out::println);

上面的代码示例并没有像我希望的那样打印“/search/sub1/data”和/search/sub2/data。FileUtils 来自http://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/FileUtils.html

有人有解决办法吗?

【问题讨论】:

  • 您编写代码来进行搜索。

标签: java io


【解决方案1】:

您可以像这样使用 Java 7 Files.walkFileTreePathMatcherFileVisitor 实现同样的目的

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class MyVisitor extends SimpleFileVisitor<Path> {

    PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:data");

    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        if (matcher.matches(dir.getFileName())) {
            System.out.println("dir found " + dir);
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        if (matcher.matches(file.getFileName())) {
            System.out.println("file found " + file);
        }

        return FileVisitResult.CONTINUE;
    }

    public static void main(String[] args) throws IOException {
        Files.walkFileTree(Paths.get("full/path/to/your/search"), new MyVisitor());
    }
}

【讨论】:

  • Apache Commons FileUtils 是否有一个选项可以做到这一点?我会发现效率更高(代码行更少)。
  • @TonyStark 我尝试了 FileUtils 的各种方法,但无法使用 FileUtils 实现您想要的,这就是我在 Java 7 中编写代码的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2014-03-08
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多