Java 目录从递归搜索文件
Java 接下来,我将介绍一个示例程序,该程序递归地搜索指定目录(包括其子目录)中的文件,并检索符合搜索条件的文件列表。
这些命令执行的操作与 UNIX 命令 `ls -R` 和 Windows 命令 `dir /s` 相同。
此外,您还可以在要搜索的文件名中指定 * 作为通配符,或者使用正则表达式进行搜索。
例如,在以下示例中,将递归搜索目录“filelist”,包括其子目录,并获取扩展名为“.java”的文件列表。
File[] files = search.listFiles(“C:/filelist/”, “*.java”);
示例程序
/**
*
*/
public class FileSearch {
public static final int TYPE_FILE_OR_DIR = 1;
public static final int TYPE_FILE = 2;
public static final int TYPE_DIR = 3;
/**
* 从指定的目录 [directoryPath] 中,
* 递归搜索目标文件 [fileName] 并找到匹配项
* 返回文件对象列表。
*
* 例子)
* File[] files = listFiles(“C:/filelist/”, “*.java”);
* 在上面的例子中,目录文件列表是递归搜索的。
* 获取扩展名为 .java 的文件列表。
*
* @param directoryPath 要搜索的目录路径。
* @param fileName 要搜索的文件名
*文件名中可以使用通配符*。
* @return 与搜索条件匹配的文件对象
*/
public File[] listFiles(String directoryPath, String fileName) {
// 将 * 作为通配符转换为正则表达式
如果 (fileName != null) {
fileName = fileName.replace(“.”, “\\.”);
fileName = fileName.replace(“*”, “.*”);
}
返回 listFiles(directoryPath, fileName, TYPE_FILE, true, 0);
}
/**
* 从指定的目录 [directoryPath] 中,使用指定的正则表达式
* 递归搜索目标文件 [fileNamePattern],
* 返回匹配的文件对象列表。
*
此外,您还可以通过检查文件的修改日期是否超过原始修改日期指定的天数来进行搜索。
您可以指定这一点。
*
* 例子)
* 文件[] files =
* listFiles(“C:/filelist/”, “*.java”,TYPE_FILE, true, 2);
* 在上面的示例中,目录文件列表是递归搜索的,并且更新后只显示 7 天前或之后更新的文件。
* 获取扩展名为 .java 的文件列表。
*
* @param directoryPath 要搜索的目录路径。
* @param fileNamePattern 要搜索的文件名 [正则表达式]
* @param type 对应的文件对象由 [type] 决定,
* 可选择以下方案:
* TYPE_FILE_OR_DIR... 文件和目录
* TYPE_FILE... 文件
* TYPE_DIR...目录
* @param isRecursive: 如果要递归搜索,请设置为 true。
* @param period 搜索目标是修改日期超过指定天数的文件。
您可以配置是否启用此功能。
* 如果为 0,则不适用。
* 如果该数字为 1 或更大,则搜索范围将包括指定天数之后的文件。
* 如果值为 -1 或更小,则搜索范围将包括早于指定天数的文件。
* @return 与搜索条件匹配的文件对象
*/
public File[] listFiles(String directoryPath,
字符串 fileNamePattern,整数类型,,
boolean isRecursive, int period) {
File dir = new File(directoryPath);
如果 (!dir.isDirectory()) {
抛出新的 IllegalArgumentException
(参数指定的路径 [" + dir.getAbsolutePath() +
“"] 不是一个目录。");
}
File[] files = dir.listFiles();
// 该输出
for (int i = 0; i < files.length; i++) {
文件文件 = files[i];
addFile(type, fileNamePattern, set, file, period);
// 递归搜索,如果是目录,则递归地将其添加到列表中。
如果 (isRecursive && file.isDirectory()) {
listFiles(file.getAbsolutePath(), fileNamePattern,
类型、是否递归、句号);;
}
}
return (File[]) set.toArray(new File[set.size()]);
}
private void addFile(int type, String match, TreeSet set,
文件 file,int period) {
开关(类型){
case TYPE_FILE:
如果 (!file.isFile()) {
返回;
}
休息;
case TYPE_DIR:
如果 (!file.isDirectory()) {
返回;
}
休息;
}
如果 (match != null && !file.getName().matches(match)) {
返回;
}
// 如果有一个规范来检查是否已经过去了指定的天数。
如果(周期 != 0){
// 文件修改日期
Date lastModifiedDate = new Date(file.lastModified());
String lastModifiedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(lastModifiedDate);
// 指定日期(一天以毫秒计算)
long oneDayTime = 24L * 60L * 60L * 1000L;
long periodTime = oneDayTime * Math.abs(period);
DateDesignDate =
new Date(System.currentTimeMillis() – periodTime);
String designatedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(指定日期);
如果(周期 > 0){
如果 (lastModifiedDateStr.compareTo(designatedDateStr) < 0) {
返回;
}
别的 {
如果 (lastModifiedDateStr.compareTo(designatedDateStr) > 0) {
返回;
}
}
}
// 如果所有条件都满足,则将其存储到列表中
set.add(file);
}
/** 使用 TreeSet 按字母顺序排序。 */
private TreeSet set = new TreeSet();
/**
* 如果创建实例后想再次使用该实例,请使用此方法。
* 需要清除通话记录。
* 例子)
* FileSearch search = new FileSearch();
* File[] f1 = search.listFiles(C:/filelist/”, “*.java”);
* 搜索.clear();
* File[] f2 = search.listFiles(“C:/filelist/”, “*.jsp”);
*/
public void clear(){
set.clear();
}
}
执行结果
为了验证示例程序,我创建了一个名为 `filelist` 的目录,并准备了以下文件。
显示文件名和修改日期。
*请注意,当前日期为2007/08/18假设情况确实如此。
C:\filelist │ aaa.java 2007/08/18 │ bbb.java 2007/08/18 └─dir ccc.java 2007/07/17 ddd.java 2007/08/18 eee.jpg 2007/08/16
◆示例
System.out.println("\n●获取所有文件");
File[] files = search.listFiles(path, null);
printFileList(files);
搜索.clear();
System.out.println("\n●获取扩展名为 .java 的文件");
files = search.listFiles(path, “*.java”);
printFileList(files);
搜索.clear();
System.out.println("\n●获取所有文件和目录");
files = search.listFiles(path, null, search.TYPE_FILE_OR_DIR, true, 0);
printFileList(files);
搜索.clear();
System.out.println("\n●检索距当前日期两天或更久以前更新的文件");
files = search.listFiles(path, null, search.TYPE_FILE, true, 2);
printFileList(files);
搜索.clear();
System.out.println("\n●检索当前日期之前30天或更早的文件");
files = search.listFiles(path, null, search.TYPE_FILE, true, -30);
printFileList(files);
搜索.clear();
}
private static void printFileList(File[] files) {
for (int i = 0; i < files.length; i++) {
文件文件 = files[i];
System.out.println((i + 1) + “: ” + file);
}
}
◆输出结果
●获取所有文件 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ccc.java 4: C:\filelist\dir\ddd.java 5: C:\filelist\dir\eee.jpg ●获取扩展名为 .java 的文件 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ccc.java 4: C:\filelist\dir\ddd.java ●获取所有文件和目录 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir 4: C:\filelist\dir\ccc.java 5: C:\filelist\dir\ddd.java 6: C:\filelist\dir\eee.jpg ●获取从今天开始更新的文件,从两天前开始 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ddd.java 4: C:\filelist\dir\eee.jpg ●检索30天或更早的旧文件(从当前日期算起) 1: C:\filelist\dir\ccc.java
