我想在目录中搜索文件。文件名包含一些字符串,如00012345,而完整名称应为XXXXXX_00012345_XXXXXX.PDF。
我是否需要遍历目录以查找所有文件的文件名以比较其名称?我的目录有很多文件,我不想这样做。
加: 该目录包含数百万个文件,所有文件都是pdf。 我每次只需要一个。
答案 0 :(得分:2)
您可以将此作业委托给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
对象。
答案 1 :(得分:1)
实施java.io.FilenameFilter
对正确扩展名(String.endsWith()
)的检查以及其他目标字符串(String.indexOf()
)的存在,然后将其传递给File.listFiles(FilenameFilter)
。在这种情况下,File
指向感兴趣的目录。
答案 2 :(得分:1)
如其他答案中所述,有各种便利方法/库可帮助您完成此操作。但是在某个级别它们都需要读取所有目录条目,并将名称与您的模式进行比较。
为什么?
因为这是典型操作系统提供用于执行此类操作的API。如果要检查数百万个文件名,这将不可避免地变慢。
如果您想快速完成此类操作,则需要重新设计系统,以便为文件空间提供一些(目录)结构,以便导航到所需的文件而不是搜索。我不知道这对你的申请是否可行。
答案 3 :(得分:0)
如果您需要递归搜索,Apache Commons-IO FileUtils可以很好地处理listFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)
答案 4 :(得分:0)
commons.io的FileUtils为递归搜索提供了直接的API ..
FileUtils.listFiles(,,);
例如
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将包含从给定目录递归搜索到其递归深度的所有文件集合。