我有一个目录,里面有一些名为 "a_id_XXX.zip"
的文件。
如何在给定 id
和 File dir
的情况下检查文件是否存在?
将一个FileFilter
(此处使用anonymously) 传递给目录File
的listFiles()
方法,如下所示:
File dir = new File("some/path/to/dir");
final String id = "XXX"; // needs to be final so the anonymous class can use it
File[] matchingFiles = dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().equals("a_id_" + id + ".zip");
}
});
作为一种方法打包,它看起来像:
public static File[] findFilesForId(File dir, final String id) {
return dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().equals("a_id_" + id + ".zip");
}
});
}
你可以这样调用它:
File[] matchingFiles = findFilesForId(new File("some/path/to/dir"), "XXX");
boolean exists = findFilesForId(new File("some/path/to/dir"), "XXX").length > 0
我创建了名为a_id_123.zip、a_id_124.zip、a_id_125.zip和a_id_126.zip的zip文件,看起来工作正常,但我不确定这是否是你想要的合适答案。如果上面列出的文件存在,输出将如下:
found a_id_126.zip
public static void main(String[] args) {
String pathToScan = ".";
String fileThatYouWantToFilter;
File folderToScan = new File(pathToScan); // import -> import java.io.File;
File[] listOfFiles = folderToScan.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
fileThatYouWantToFilter = listOfFiles[i].getName();
if (fileThatYouWantToFilter.startsWith("a_id_")
&& fileThatYouWantToFilter.endsWith(".zip")) {
System.out.println("found" + " " + fileThatYouWantToFilter);
}
}
}
}
这个解决方案是在Bohemian的回答基础上进行的泛化。它使用正则表达式,并使用Java 8 lambda表达式替换了内部类。感谢@Bohemian原始实现。
import java.io.File;
public class FileFinder {
public static void main(String[] args){
File directory = new File("D:\\tmp");
String id = "20140430104033";
for (File f : findFilenamesWithId(id, directory)){
System.out.println(f.getAbsoluteFile());
}
}
/** Finds files in the specified directory whose names are formatted
as "a_id_ID.zip" */
public static File[] findFilenamesWithId(String ID, File dir) {
return findFilenamesMatchingRegex("^a_id_" + ID + "\\.zip$", dir);
}
/** Finds files in the specified directory whose names match regex */
public static File[] findFilenamesMatchingRegex(String regex, File dir) {
return dir.listFiles(file -> file.getName().matches(regex));
}
}
Java 7提供了一些良好的模式匹配支持(PathMatcher)和递归目录遍历(Files.walkFileTree())。在原问题的背景下,Oracle的Java文档页面是一个不错的起点:
查找文件: http://docs.oracle.com/javase/tutorial/essential/io/find.html
您可以使用Apache的WildcardFileFilter
使用Java 8查找目录及其子目录中符合正则表达式条件的所有文件
我的条件是查找所有名为Audit_Report_xxxxxx.xls的文件
// get List of Audit Report file in directory and sub directory
public List<String> getAuditReporFile(String baseDirectory) throws Exception{
// select all available files in directory and subdirectory
return Files.walk(Paths.get(baseDirectory))
.filter(Files::isRegularFile).filter(x-> {
// use regex and check if file name is according to our requirement
return Pattern.compile("Audit_Report_.*\\.xls").matcher(x.getFileName().toString()).find();
}).map(x->x.getFileName().toString()).collect(Collectors.toList());
}