java - 从 nio 中的模式或 java 中的文件对象中查找文件名的最快方法
问题描述
我有一个存储了 100 万个文件的位置。我想获取列表中的所有文件,并从该列表中查找文件名中包含单词的所有文件。这里唯一重要的是性能应该非常好。所有的事情都应该很快发生,因此我正在寻找最快的方法。我很困惑是应该使用 java 传统文件对象还是应该使用 NIO。我尝试了如下文件对象:
String[] fileList = null;
String fileNamePart = "somepartoffileName";
try{
File rootFolder = new File(dir);
if(rootFolder.isDirectory()){
fileList = rootFolder.list();
}
catch(Exception e){
System.out.println("Not a valid directory "+dir);
}
String[] listFiles = Arrays.stream(fileList).filter(s ->
s.contains(FileNamePart)).toArray(String []::new);
有没有更快的方法来实现这一目标?我不介意使用文件数组或来自 nio 的东西,但我的性能应该更快。此外,要匹配的模式可以从 1 到 1000。因此可以匹配一个字符串,或者该字符串可以包含 1000 个逗号分隔值
解决方案
即使按照 Java 8 之前的标准,您的代码也过于复杂。API 规范没有提到为无效目录引发的任何异常(该方法将改为返回)null
,因此没有理由添加此异常处理。此外,null
如果文件不是目录,则该方法将返回,因此该rootFolder.isDirectory()
测试也已过时。
所以,得到一个未经过滤的列表,就像
File rootFolder = new File(dir);
String[] fileList = rootFolder.list();
并且很容易添加过滤器,现在调用File.list(FilenameFilter)
,使用 Java 8 功能:
File rootFolder = new File(dir);
String[] fileList = rootFolder.list((p, n) -> n.contains(fileNamePart));
推荐阅读
- formsflow.ai - 使用工作流“电子邮件通知”创建的表单
- java - 带有传统 Java 的 keycloak:一个简单的 api 示例?
- arrays - Ruby 中的数组解构
- python - 气流任务状态失败,“重试”参数> 0
- javascript - 我创建了随机密码生成器。它接受数字并打印该长度的随机密码。它在控制台上打印密码但被刷新
- c# - 事件侦听器不适用于 firebase 查询
- java - Spring Boot 中的邮件发送异常
- xamarin.forms - Xamarin Forms Prism (DialogService) with Switch in ListView items - EventToCommandBehaviour 触发多次
- reactjs - 如何打破 MUIDataTable 列单元格内容
- python - 如何在硒(python)中关闭标签广告