import java.io.*;
import java.util.*;public class FileDemo06 {
//查找符合条件的文件,并返回一个文件名列表
public static List<File> findFiles(String baseDirName, String targetFileName, int count) {
LinkedList<File> fileList = new LinkedList<File>(); //创建一个列表,里面装目录或子目录 LinkedList<File> fileList2 = new LinkedList<File>(); //创建一个列表,里面装搜到的文件 File baseDir = new File(baseDirName);
if(!baseDir.exists() || !baseDir.isDirectory()) {
System.out.println("文件查找失败," + baseDirName + " 不是一个目录!");
return fileList2;
}
String tempName = null;
fileList.addLast(baseDir);
File tempFile = null;
while(!fileList.isEmpty()) {
tempFile = fileList.removeFirst(); //将列表中的第一个元素取出并删除
if(tempFile.exists() && tempFile.isDirectory()) {
File[] files = tempFile.listFiles();
for(int i = 0; i < files.length; i ++) {
//如果是目录则放进队列
if(files[i].isDirectory())
fileList.add(files[i]);
else {
//如果是文件则根据文件名与目标文件名进行匹配
tempName = files[i].getName();
if(matchWord(targetFileName, tempName)) {
//匹配成功,将文件名添加到结果集
fileList2.add(files[i].getAbsoluteFile());
//如果已经达到指定的数目,则退出循环
if(count != 0 && fileList2.size() > count) {
return fileList;
}
}
}
}
}
}
return fileList2;
} //文件名的通配符匹配,如果匹配成功则返回 true,否则返回 false
public static boolean matchWord(String pattern, String str) {
int patternLength = pattern.length();
int strLength = str.length();
int strIndex = 0;
char ch;
for(int patternIndex = 0; patternIndex < patternLength; patternIndex ++) {
ch = pattern.charAt(patternIndex);
if(ch == '*') { //通配符 * 表示可以匹配任意多个字符
while(strIndex < strLength) {
if(matchWord(pattern.substring(patternIndex + 1), str.substring(strIndex))) {
return true;
}
strIndex ++;
}
}
else if(ch == '?') { //通配符 ? 表示匹配任意一个字符
strIndex ++;
if(strIndex > strLength) { //表示 str 中已经没有字符匹配了
return false;
}
}
else {
if((strIndex >= strLength) || (ch != str.charAt(strIndex))) {
return false;
}
strIndex ++;
}
}
return (strIndex == strLength);
}
public static void main(String[] args) { String baseDir = "D:\\temp";
String txtName = "*.txt";
int countNumber = 10;
System.out.println("在D盘的temp目录下查找扩展名为 " + txtName + " 的文件");
List<File> txtList = findFiles(baseDir, txtName, countNumber);
if(txtList.size() == 0) {
System.out.println("No File Fount");
}
else {
for(int i = 0; i < txtList.size(); i ++) {
System.out.println(txtList.get(i));
}
} }
}
功能:从一个目录中查找符合条件的文件
第二个 matchWord 方法没看懂,求注释一下,或者解释解释,谢谢

解决方案 »

  1.   

    就是一个递归
    遍历pattern的每个字符
    1 如果是*号,就把*号后面的字符串作为pattern,把str当前位置strIndex以后的字符串作为目标字符串,递归调用判断,并把判断结果返回
    比如说 pattern=55*11,str=55622,那么把*后面的11当作pattern,strIndex位置以后22当作str,递归调用,判断11和22是否匹配,并返回11和22比较的结果2 如果是?号,则str跳过一个字符
    比如说 pattern=55?11,str=55622,那么遇到?号的时候,str就跳过6不去比较3 如果是其他情况,则比较当前遍历的pattern的字符和str当前位置strIndex的字符是否一致,如果不一致立刻返回false遍历结束,如果长度刚好一致,则返回true,否则返回false
      

  2.   

    楼上说的已经很清楚了,最复杂的是第一个判断里的递归,我接着楼上的说,返回11和22的比较结果回到主程序后,还会继续用11与2比较,直到到达str字符串结尾处才终止,这样才能实现*匹配任意多个字符,楼上举的例子不够典型,我再说一个吧,比如:
    pattern=55*11,str=5562211
    如果是这样,在while循环里的递归中,前几次是false,但回到主程序还会继续向后截断并试图匹配,后面会拿11与2211、211、11去匹配直到成功。
      

  3.   

    就是一个递归
    遍历pattern的每个字符
    1 如果是*号,就把*号后面的字符串作为pattern,把str当前位置strIndex以后的字符串作为目标字符串,递归调用判断,并把判断结果返回
    比如说 pattern=55*11,str=55622,那么把*后面的11当作pattern,strIndex位置以后22当作str,递归调用,判断11和22是否匹配,并返回11和22比较的结果2 如果是?号,则str跳过一个字符
    比如说 pattern=55?11,str=55622,那么遇到?号的时候,str就跳过6不去比较3 如果是其他情况,则比较当前遍历的pattern的字符和str当前位置strIndex的字符是否一致,如果不一致立刻返回false遍历结束,如果长度刚好一致,则返回true,否则返回false