列出与Java模式匹配的目录中的文件
我正在寻找一种方法来获取与给定目录中的模式(pref regex)匹配的文件列表 我在网上找到了一个教程,它使用apache的commons io包,其中包含以下代码:列出与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
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
}
}