将文件列在与Java中的模式匹配的目录中

Oma*_*eji 79 java io

我正在寻找一种方法来获取与给定目录中的模式(pref regex)匹配的文件列表.

我在网上找到了一个使用apache的commons-io包的教程,代码如下:

Collection getAllFilesThatMatchFilenameExtension(String directoryName, String extension)
{
  File directory = new File(directoryName);
  return FileUtils.listFiles(directory, new WildcardFileFilter(extension), null);
}
Run Code Online (Sandbox Code Playgroud)

但这只是返回一个基本集合(根据文档,它是一个集合java.io.File).有没有办法做到这一点,返回一个类型安全的通用集合?

Kev*_*vin 120

请参见文件#listFiles(FilenameFilter).

File dir = new File(".");
File [] files = dir.listFiles(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.endsWith(".xml");
    }
});

for (File xmlfile : files) {
    System.out.println(xmlfile);
}
Run Code Online (Sandbox Code Playgroud)

  • 这意味着java读取所有文件,然后丢弃不匹配的文件。与过滤自身的系统命令相比,这不是很慢吗? (2认同)
  • @flaschenpost 不一定,因为文档没有承诺实现如何处理缓存和其他与性能相关的细节。这种类型的任何方法的主要限制是对磁盘的 IO 调用以读取文件元数据。系统命令仍然必须读取所有相同的信息,因此它可能足够接近以至于不值得担心。用纯 Java 处理它可以让其他人处理与获取元数据相关的平台特定问题。 (2认同)

小智 46

从Java 8开始,您可以使用lambdas并实现更短的代码:

File dir = new File(xmlFilesDirectory);
File[] files = dir.listFiles((d, name) -> name.endsWith(".xml"));
Run Code Online (Sandbox Code Playgroud)


Tar*_*rek 21

从java 7开始,你可以在java.nio包中实现相同的结果:

Path dir = ...;
List<File> files = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{java,class,jar}")) {
    for (Path entry: stream) {
        files.add(entry.toFile());
    }
    return files;
} catch (IOException x) {
    throw new RuntimeException(String.format("error reading folder %s: %s",
    dir,
    x.getMessage()),
    x);
}
Run Code Online (Sandbox Code Playgroud)


jjn*_*guy 14

以下代码将根据的accept方法创建一个文件列表FileNameFilter.

List<File> list = Arrays.asList(dir.listFiles(new FilenameFilter(){
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".exe"); // or something else
        }}));
Run Code Online (Sandbox Code Playgroud)