【问题标题】:Listing files in a directory matching a pattern in Java [duplicate]列出与Java中的模式匹配的目录中的文件[重复]
【发布时间】: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

标签: java io


【解决方案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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-05-02
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 2020-01-23
        • 1970-01-01
        • 2012-09-19
        相关资源
        最近更新 更多