列出与Java中的模式匹配的目录中的文件[重复]

Posted

技术标签:

【中文标题】列出与Java中的模式匹配的目录中的文件[重复]【英文标题】:Listing files in a directory matching a pattern in Java [duplicate] 【发布时间】:2011-01-07 08:37:43 【问题描述】:

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

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

Collection getAllFilesThatMatchFilenameExtension(String directoryName, String extension)

  File directory = new File(directoryName);
  return FileUtils.listFiles(directory, new WildcardFileFilter(extension), null);

但这只是返回一个基本集合(根据the docs,它是java.io.File 的集合)。有没有办法返回一个类型安全的泛型集合?

【问题讨论】:

你为什么不加一个演员表?我想基本集合是出于兼容性原因(使用较旧的 java 版本)。如果你想绝对确定,你可以创建一个副本并在类型检查之后添加元素(无论如何,泛型只是编译时检查) @bertolami,不要将答案放在 cmets 中。 :) 发表评论 5 年后...那里有一些强大的死灵魔法@LimitedAtonement 另见此链接:***.com/questions/16143494/… 【参考方案1】:

见File#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);

【讨论】:

这意味着java读入所有文件,然后丢弃那些不匹配的文件。与任何过滤自身的系统命令相比,这不是非常慢吗? @flaschenpost 不一定,因为文档没有承诺实现如何处理缓存和其他与性能相关的细节。这种类型的任何方法的主要限制是对磁盘的 IO 调用以读取文件元数据。系统命令仍然需要读取所有相同的信息,因此它可能已经足够接近,不值得担心。在纯 Java 中处理它可以让其他人处理与获取该元数据相关的平台特定问题。 好的。我只是习惯了使用glob 方法的所有语言,我希望它可以在文件系统实现中运行并且速度提高大约 100 倍(但没有检查过这个)。但我仍然必须习惯 java 风格,其中“快速”意味着秒而不是纳秒。 ;-)【参考方案2】:

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

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

【讨论】:

这需要指定一个模式匹配位。 @jinguy 如何在此处指定模式而不是使用 .endsWith() 方法?【参考方案3】:

现有代码的包装器怎么样:

public Collection<File> getMatchingFiles( String directory, String extension ) 
     return new ArrayList<File>()( 
         getAllFilesThatMatchFilenameExtension( directory, extension ) );
 

不过我会发出警告。如果你能忍受这个警告,那么你就完成了。

【讨论】:

【参考方案4】:

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

【讨论】:

如何在此处指定模式而不只是过滤扩展?【参考方案5】:

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

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

【讨论】:

【参考方案6】:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class CharCountFromAllFilesInFolder 

    public static void main(String[] args)throws IOException 

        try

            //C:\Users\MD\Desktop\Test1

            System.out.println("Enter Your FilePath:");

            Scanner sc = new Scanner(System.in);

            Map<Character,Integer> hm = new TreeMap<Character, Integer>();

            String s1 = sc.nextLine();

            File file = new File(s1);

            File[] filearr = file.listFiles();

            for (File file2 : filearr) 
                System.out.println(file2.getName());
                FileReader fr = new FileReader(file2);
                BufferedReader br = new BufferedReader(fr);
                String s2 = br.readLine();
                for (int i = 0; i < s2.length(); i++) 
                    if(!hm.containsKey(s2.charAt(i)))
                        hm.put(s2.charAt(i), 1);
                    //if
                    else
                        hm.put(s2.charAt(i), hm.get(s2.charAt(i))+1);
                    //else

                //for2

                System.out.println("The Char Count: "+hm);
            //for1

        //try
        catch(Exception e)
            System.out.println("Please Give Correct File Path:");
        //catch
    

【讨论】:

以上是关于列出与Java中的模式匹配的目录中的文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

列出与模式不匹配的文件?

在 C# 中列出文件夹内的重复文件:利用 LINQ.AsParallel

检查目录是不是存在并计算与其中模式匹配的文件[重复]

PHP列出目录中的所有文件[重复]

通过 MapReduce 读取与特定模式匹配的目录中的文件并输出各个文件的名称

发布模式符号文件 .dll.mdb 中的 Fody 异常与程序集 .dll 不匹配