列出与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