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

列出与Java模式匹配的目录中的文件,java,io,Java,Io,我正在寻找一种方法来获取与给定目录中的模式(pref regex)匹配的文件列表 我在网上找到了一个教程,它使用apache的commons io包,其中包含以下代码: Collection getAllFilesThatMatchFilenameExtension(String directoryName, String extension) { File directory = new File(directoryName); return FileUtils.listFiles(d

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

我在网上找到了一个教程,它使用apache的commons io包,其中包含以下代码:

Collection getAllFilesThatMatchFilenameExtension(String directoryName, String extension)
{
  File directory = new File(directoryName);
  return FileUtils.listFiles(directory, new WildcardFileFilter(extension), null);
}
但这只是返回一个基本集合(根据它是
java.io.File
的集合)。是否有方法返回类型安全的泛型集合?

请参阅


以下代码将基于
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
        }}));
List List=Arrays.asList(dir.listFiles(newfilenamefilter()){
@凌驾
公共布尔接受(文件目录,字符串名称){
返回name.endsWith(“.exe”);//或其他内容
}}));

如何包装现有代码:

public Collection<File> getMatchingFiles( String directory, String extension ) {
     return new ArrayList<File>()( 
         getAllFilesThatMatchFilenameExtension( directory, extension ) );
 }
公共集合getMatchingFiles(字符串目录,字符串扩展名){ 返回新的ArrayList() getAllFilesThatMatchFilenameExtension(目录,扩展名)); } 不过,我会提出一个警告。如果你能接受这个警告,那么你就完了

自java 7以来,您可以使用该软件包来实现相同的结果:

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);
}
路径目录=。。。; 列表文件=新的ArrayList(); try(DirectoryStream=Files.newDirectoryStream(dir,“*.{java,class,jar}”)){ for(路径条目:流){ 添加(entry.toFile()); } 归还文件; }捕获(IOX异常){ 抛出新的运行时异常(String.format(“读取文件夹%s时出错:%s”), 局长, x、 getMessage()), x) ); }
由于Java 8,您可以使用lambdas并获得更短的代码:

File dir = new File(xmlFilesDirectory);
File[] files = dir.listFiles((d, name) -> name.endsWith(".xml"));
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.Map;
导入java.util.Scanner;
导入java.util.TreeMap;
公共类CharCountFromAllFileInfolder{
公共静态void main(字符串[]args)引发IOException{
试一试{
//C:\Users\MD\Desktop\Test1
System.out.println(“输入文件路径:”);
扫描仪sc=新的扫描仪(System.in);
Map hm=新树映射();
字符串s1=sc.nextLine();
文件=新文件(s1);
File[]filearr=File.listFiles();
对于(文件file2:filearr){
System.out.println(file2.getName());
FileReader fr=新的FileReader(file2);
BufferedReader br=新的BufferedReader(fr);
字符串s2=br.readLine();
对于(int i=0;i
这需要指定一个模式匹配位。@jinguy如何在这里指定模式而不是使用.endsWith()方法?为什么不添加一个强制转换?我认为基本集合是出于兼容性的原因(与较旧的java版本)。如果您想绝对确定,您可以创建一个副本并在类型检查后添加元素(无论如何,泛型只是编译时检查)@bertolami,不要在注释中添加答案。:)评论发表5年后。。。这是@limitedAtonementals的强大巫术,请看这个链接:这意味着java读取所有文件,然后丢弃不匹配的文件。与任何过滤自身的系统命令相比,这不是非常慢吗?@flaschenpost不一定,因为文档没有承诺实现如何处理缓存和其他与性能相关的细节。这种类型的任何方法的主要绑定都是对磁盘的IO调用,以读取文件元数据。系统命令仍然需要读取所有相同的信息,因此它可能足够接近,不值得担心。用纯Java处理它可以让其他人处理与获取元数据相关的特定于平台的问题。我已经习惯了使用
glob
方法的所有语言,我希望它能在文件系统实现中运行,速度快100倍左右(但我还没有检查这个)。但我仍然必须习惯java风格,其中“快”的意思是秒,而不是纳秒如何在这里指定模式,而不仅仅是在扩展上进行过滤?
File dir = new File(xmlFilesDirectory);
File[] files = dir.listFiles((d, name) -> name.endsWith(".xml"));
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
    }
}