Java 通讯录以来递归搜索文件
Java 介绍了一个示例程序,该程序可以递归搜索指定目录(包括子目录)中的文件,并获取符合搜索条件的文件列表。
它们等同于 UNIX 命令 ls -R 或 Windows 命令 dir /s。
您也可以在要搜索的文件名中指定 * 作为通配符,或使用正则表达式。
下面以递归搜索 filelist(包括子目录)目录为例,说明如何获取扩展名为 java 的文件列表。
File[] files = search.listFiles("C:/filelist/", "*.java");.
示例程序
/**
*
*/
公共类文件搜索{
公共静态最终int TYPE_FILE_OR_DIR = 1;
公共静态最终int TYPE_FILE = 2;
公共静态最终 int TYPE_DIR = 3;
/**
* 从指定目录[directoryPath]开始,
* 递归查找要查找的文件[fileName],找到对应的文件。
* 返回文件对象的列表。
*
* 例子)
* File[] files =listFiles(“C:/filelist/”, “*.java”);
* 上面的例子递归地搜索目录文件列表并
* 获取扩展名为java的文件列表。
*
* @param directoryPath 表示要搜索的目录的路径
* @param fileName 要搜索的文件名
* 您可以在文件名中指定 * 作为通配符。
* @return 与搜索匹配的文件对象
*/
公共文件[] listFiles(字符串目录路径,字符串文件名){
// 将 * 作为通配符转换为正则表达式
if (文件名!= null) {
文件名 = 文件名.replace(“.”, “\\.”);
文件名 = 文件名.replace(“*”, “.*”);
}
返回 listFiles(目录路径, 文件名, TYPE_FILE, true, 0);
}
/**
* 从指定目录[directoryPath]开始,指定为正则表达式
* 递归搜索要搜索的文件[fileNamePattern],
* 返回适用文件对象的列表。
*
* 您还可以使用搜索条件来确定文件的更新日期是否已经超过指定的天数。
* 可以指定。
*
* 例子)
* 文件[] 文件 =
* listFiles(“C:/filelist/”, “*.java”,TYPE_FILE, true, 2);
* 在上面的例子中,目录filelist被递归搜索并且更新时间小于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 与搜索匹配的文件对象
*/
公共文件[] listFiles(字符串目录路径,
String fileNamePattern,int类型,
布尔 isRecursive, int period) {
文件目录 = 新文件(目录路径);
if (!dir.isDirectory()) {
抛出新的 IllegalArgumentException
(“参数中指定的路径[” + dir.getAbsolutePath() +
“] 不是目录。”);
}
File[] files = dir.listFiles();
// 它的输出
for (int i = 0; i < 文件长度; i++) {
文件 文件 = 文件[i];
addFile(类型, fileNamePattern, 设置, 文件, 句点);
// 递归查找,如果是目录则递归添加到列表中
if (isRecursive && file.isDirectory()) {
listFiles(file.getAbsolutePath(), fileNamePattern,
类型、isRecursive、句点);
}
}
return (File[]) set.toArray(new File[set.size()]);
}
private void addFile(int 类型, String 匹配, TreeSet 集合,
文件 file,int 周期) {
开关(类型){
案例类型文件:
if (!file.isFile()) {
返回;
}
休息;
案例类型_目录:
if (!file.isDirectory()) {
返回;
}
休息;
}
if (match != null && !file.getName().matches(match)) {
返回;
}
// 如果有指定是否已经过了指定天数
如果(句号!= 0){
// 文件更新日期
日期最后修改日期 = new Date(file.lastModified());
String lastModifiedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(最后修改日期);
// 指定日期(以每天的毫秒数计算)
长一天时间 = 24L * 60L * 60L * 1000L;
长 periodTime = oneDayTime * Math.abs(period);
指定日期Date =
new Date(System.currentTimeMillis() – periodTime);
String DesignatedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(指定日期);
如果(周期> 0){
if (lastModifiedDateStr.compareTo(designatedDateStr) < 0) {
返回;
}
} 别的 {
if (lastModifiedDateStr.compareTo(designatedDateStr) > 0) {
返回;
}
}
}
// 如果满足所有条件则存储在列表中
set.add(文件);
}
/** 使用 TreeSet 按字母顺序排序。 */
私有 TreeSet set = new TreeSet();
/**
* 如果您想在创建实例后继续使用该实例,请使用此方法。
* 呼叫必须被清除。
* 例子)
* 文件搜索搜索 = new FileSearch();
* File[] f1 = search.listFiles(C:/filelist/”, “*.java”);
* 搜索.clear();
* File[] f2 = search.listFiles(“C:/filelist/”, “*.jsp”);
*/
公共无效清除(){
设置.clear();
}
}
执行结果
为了检查样本程序,我们创建了一个文件列表目录,并准备了以下文件。
显示文件名和更新日期。
*请注意,当前日期是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);
打印文件列表(文件);
搜索.清除();
System.out.println(“\n●获取扩展名为java的文件”);
文件 = search.listFiles(路径, “*.java”);
打印文件列表(文件);
搜索.清除();
System.out.println(“\n●获取所有文件和目录”);
文件= search.listFiles(路径, null,search.TYPE_FILE_OR_DIR, true, 0);
打印文件列表(文件);
搜索.清除();
System.out.println(“\n●获取当前日期后2天内更新的文件”);
文件= search.listFiles(路径, null,search.TYPE_FILE, true, 2);
打印文件列表(文件);
搜索.清除();
System.out.println(“\n●获取距离当前日期超过30天的旧文件”);
文件 = search.listFiles(路径, null,search.TYPE_FILE, true, -30);
打印文件列表(文件);
搜索.清除();
}
私有静态无效 printFileList(File[] files) {
for (int i = 0; i < 文件长度; i++) {
文件 文件 = 文件[i];
System.out.println((i + 1) + “:” + 文件);
}
}
输出结果
检索所有文件 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\direee.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\direee.jpg 从当前日期获取两天前更新的文件 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ddd.java 4: C:\filelist\dir\direee.jpg 获取距当前日期 30 天以上的文件 1: C:\filelist\dir\ccc.java