我想在目录中搜索一个文件。文件名包含一些字符串,例如00012345,而完整的名称应该是XXXXXX_00012345_XXXXXX.PDF。
我是否需要遍历目录查找所有文件的文件名以比较它们的名称?我的目录有很多文件,我不想这样做。
加上:这个目录包含数百万个文件,它们都是pdf格式的。我每次只需要一个
您可以将此任务委托给java.io.File
类,它有一些方便的方法从目录中返回符合某些标准的文件列表。
在你的情况下,我将实现一个FilenameFilter
,它测试,如果一个文件名符合你的标准,并使用这个方法:
File[] files = directory.listFiles(new FileNameFilter() {
@Override
public boolean accept(File dir, String name) {
return nameMatchesCriteria(); // to be implemented...
}
});
以directory
为File
对象
有各种方便的方法/库可以帮助您完成此操作,如其他答案所述。然而,在某种程度上它们都需要读取所有目录条目,并将名称与您的模式进行比较。
为什么?
因为那是一个典型的操作系统提供的API来做这类事情。如果要检查数以百万计的文件名,这将不可避免地很慢。
如果您想要快速完成这类事情,您需要重新设计您的系统,以便为文件空间提供一些(目录)结构,以便您可以导航到所需的文件,而不是搜索。我不知道这对你的应用程序是否可行。
实现java.io.FilenameFilter
检查正确的扩展(String.endsWith()
)和其他目标字符串(String.indexOf()
)的存在,然后将其传递给File.listFiles(FilenameFilter)
。本例中的File
,指向感兴趣的目录。
如果您需要递归搜索,Apache Commons-IO FileUtils可以很好地完成listFiles(文件目录,IOFileFilter fileFilter, IOFileFilter dirFilter)
共享文件。io为递归搜索提供直接API ..
FileUtils。
。
String extensions = {"pdf", "xml"};
bool recursiveSearch = true;
File dir = new File("<path of directory to be searched>");
Collection searchResult = FileUtils.listFiles(dir , extensions, recursiveSearch );
searchResult将包含从给定目录到递归深度递归搜索的所有文件集合。