• 文件搜索器


     1 package com.arraySet;
     2 
     3 import java.util.LinkedList;
     4 
     5 public class Queue {
     6     private LinkedList data = new LinkedList();
     7     
     8     public Queue(){}
     9     
    10     public boolean isEmpty(){
    11         return data.isEmpty();
    12     }
    13     
    14     //往队列尾部添加对象
    15     public void add(Object e){
    16         this.data.addLast(e);
    17     }
    18     //查看队列首个对象
    19     public Object peek(){
    20         if(this.isEmpty()){
    21             return null;
    22         }
    23         return this.data.getFirst();
    24     }
    25     
    26     //移除队列首个对象
    27     public boolean remove(){
    28         if(this.isEmpty()){
    29             return false;
    30         }
    31         data.removeFirst();
    32         return true;
    33     }
    34     
    35     //弹出首个对象
    36     public Object pop(){
    37         if(this.isEmpty()){
    38             return null;
    39         }
    40         return data.removeFirst();
    41     }
    42     
    43     //查询任意对象在队列中的索引
    44     public int index(Object e){
    45         if(this.isEmpty()){
    46             return -1;
    47         }
    48         return data.indexOf(e);
    49     }
    50     
    51     //清空队列
    52     public void clear(){
    53         data.clear();
    54     }
    55 }
      1 package com.test;
      2 
      3 import java.io.File;
      4 import java.util.ArrayList;
      5 import java.util.List;
      6 
      7 import com.arraySet.Queue;
      8 
      9 /**
     10  * 查找给定的路径baseDirName下匹配符合targetFileName格式的count个文件
     11  * @author Administrator
     12  *
     13  */
     14 public class FileFinder {
     15     public static List findfiles(String baseDirName,String targetFileName,int count){
     16         List fileList = new ArrayList();
     17         File baseDir = new File(baseDirName);
     18         
     19         if(!baseDir.exists() || !baseDir.isDirectory()){
     20             System.out.println("文件查找失败:"+baseDirName+"不存在或者不是目录!");
     21             return fileList;
     22         }
     23         Queue queue = new Queue();
     24         //用于临时保存队列文件夹中的文件名
     25         String tempName = null;
     26         queue.add(baseDir);
     27         //外层循环
     28         while(!queue.isEmpty()){
     29             File tempFile = (File)queue.pop();
     30             if(tempFile.exists() && tempFile.isDirectory()){
     31                 File[] files = tempFile.listFiles();
     32                 for(File file:files){
     33                     if(file.isDirectory()){
     34                         queue.add(file);
     35                     }else{
     36                         tempName = file.getName();
     37                         //判断文件名与表达式是否匹配
     38                         if(FileFinder.wildcardMatch(targetFileName, tempName)){
     39                             fileList.add(file.getAbsolutePath());
     40                             if((count!=0) && fileList.size()>=count){
     41                                 //退出整个外部循环
     42                                 return fileList;
     43                             }
     44                         }
     45                     }
     46                 }
     47             }
     48         }
     49         return fileList;
     50     }
     51     
     52     /**
     53      * 遗留问题:在类方法中的全局变量patternLength、strLength、tempLength,在嵌套循环中被调用,方法中的全局如何分别存储方法加载的值和嵌套循环的值
     54      * @param pattern
     55      * @param str
     56      * @return
     57      */
     58     private static boolean wildcardMatch(String pattern, String str){
     59 //        System.out.print("pattern:"+pattern+"	"+"str:"+str+"	");
     60         int patternLength = pattern.length();
     61         int strLength = str.length();
     62         int tempLength = 0;
     63         char ch;
     64         for(int patternIndex=0;patternIndex < patternLength;patternIndex++){
     65             ch = pattern.charAt(patternIndex);
     66             if(ch=='*'){
     67                 //*后面的字符串直到匹配到最后找到匹配为止,截取字符串从下标0开始,而字符串长度从1开始
     68                 while(tempLength < (strLength-1)){
     69 //                    System.out.println("tempLength1:"+tempLength);
     70                     //调用的时候pattern、str值为截取后的字符串,调用结束返回时恢复为方法加载的全局值
     71                     if(wildcardMatch(pattern.substring(patternIndex + 1), str.substring(tempLength))){
     72                         return true;
     73                     }
     74                     tempLength++;
     75 //                    System.out.println("tempLength2:"+tempLength);
     76                 }
     77             }else if(ch=='?'){
     78                 tempLength++;
     79                 if(tempLength>strLength){
     80                     return false;
     81                 }
     82             }else{
     83                 if((tempLength>strLength) || (ch!=str.charAt(tempLength))){
     84                     return false;
     85                 }
     86                 tempLength++;
     87             }
     88         }
     89         return (tempLength == strLength);
     90     }
     91     
     92     private static void printArrayList(List list){
     93         for(int i=0;i<list.size();i++){
     94             System.out.println(list.get(i));
     95         }
     96     }
     97     public static void main(String[] args) {    
     98         String baseDIR = "D:/software/jdk/jdk7/lib";
     99         String targetFileName1 = "*.jar";
    100         List fileList = FileFinder.findfiles(baseDIR, targetFileName1, 8);
    101         FileFinder.printArrayList(fileList);
    102     }
    103 }
    1 执行结果:
    2 D:softwarejdkjdk7libant-javafx.jar
    3 D:softwarejdkjdk7libdt.jar
    4 D:softwarejdkjdk7libjavafx-doclet.jar
    5 D:softwarejdkjdk7libjavafx-mx.jar
    6 D:softwarejdkjdk7libjconsole.jar
    7 D:softwarejdkjdk7libsa-jdi.jar
    8 D:softwarejdkjdk7lib	ools.jar
    9 D:softwarejdkjdk7libmissioncontrolmc.jar
      1 package com.test;
      2 
      3 import java.io.File;
      4 import java.util.ArrayList;
      5 import java.util.List;
      6 
      7 import com.arraySet.Queue;
      8 
      9 /**
     10  * 查找给定的路径baseDirName下匹配符合targetFileName格式的count个文件
     11  * @author Administrator
     12  *
     13  */
     14 public class FileFinder {
     15     public static List findfiles(String baseDirName,String targetFileName,int count){
     16         List fileList = new ArrayList();
     17         File baseDir = new File(baseDirName);
     18         
     19         if(!baseDir.exists() || !baseDir.isDirectory()){
     20             System.out.println("文件查找失败:"+baseDirName+"不存在或者不是目录!");
     21             return fileList;
     22         }
     23         Queue queue = new Queue();
     24         //用于临时保存队列文件夹中的文件名
     25         String tempName = null;
     26         queue.add(baseDir);
     27         //外层循环
     28         while(!queue.isEmpty()){
     29             File tempFile = (File)queue.pop();
     30             if(tempFile.exists() && tempFile.isDirectory()){
     31                 File[] files = tempFile.listFiles();
     32                 for(File file:files){
     33                     if(file.isDirectory()){
     34                         queue.add(file);
     35                     }else{
     36                         tempName = file.getName();
     37                         //判断文件名与表达式是否匹配
     38                         if(FileFinder.wildcardMatch(targetFileName, tempName)){
     39                             fileList.add(file.getAbsolutePath());
     40                             if((count!=0) && fileList.size()>=count){
     41                                 //退出整个外部循环
     42                                 return fileList;
     43                             }
     44                         }
     45                     }
     46                 }
     47             }
     48         }
     49         return fileList;
     50     }
     51     
     52     /**
     53      * 遗留问题:在类方法中的全局变量patternLength、strLength、tempLength,在嵌套循环中被调用,
     54      * 方法中的全局如何分别存储方法加载的值和嵌套循环的值
     55      * 
     56      * private方法不提供给外部类调用,仅提供类内部方法调用,由于是static状态的,所以提供给内部static状态的方法调用
     57      * private方法不能调用任何方法
     58      * @param pattern
     59      * @param str
     60      * @return
     61      */
     62     private static boolean wildcardMatch(String pattern, String str){
     63         
     64         int patternLength = pattern.length();
     65         int strLength = str.length();
     66         int tempLength = 0;
     67         char ch;
     68 //        System.out.print("patternLength:"+patternLength+"	"+"strLength:"+strLength+"	");
     69         for(int patternIndex=0;patternIndex < patternLength;patternIndex++){
     70             ch = pattern.charAt(patternIndex);
     71             if(ch=='*'){
     72                 //*后面的字符串直到匹配到最后找到匹配为止,截取字符串从下标0开始,而字符串长度从1开始
     73                 while(tempLength < (strLength-1)){
     74 //                    System.out.println("tempLength1:"+tempLength);
     75 //                    System.out.print(wildcardMatch(pattern.substring(patternIndex + 1), str.substring(tempLength))+"	");
     76                     //调用的时候pattern、str值为截取后的字符串,调用结束返回时恢复为方法加载的全局值
     77                     if(wildcardMatch(pattern.substring(patternIndex + 1), str.substring(tempLength))){
     78                         
     79                         return true;
     80                     }
     81                     tempLength++;
     82 //                    System.out.println("tempLength2:"+tempLength);
     83                 }
     84             }else if(ch=='?'){
     85                 tempLength++;
     86                 if(tempLength>strLength){
     87                     return false;
     88                 }
     89             }else{
     90                 if((tempLength>strLength) || (ch!=str.charAt(tempLength))){
     91                     return false;
     92                 }
     93                 tempLength++;
     94             }
     95         }
     96         return (tempLength == strLength);
     97     }
     98     
     99     protected static void printArrayList(List list){
    100         if(list.size()==0){
    101             System.out.println("No file find!");
    102         }else{
    103             for(int i=0;i<list.size();i++){
    104                 System.out.println(list.get(i));
    105             }
    106         }
    107     }
    108 
    109     public static void main(String[] args) {    
    110         String baseDIR = "D:/software/jdk/jdk7/lib";
    111 //        String baseDIR = "D:/testfile";
    112 //        String targetFileName1 = "*.jar";
    113 //        String targetFileName1 = "?.jar";
    114 //        String targetFileName1 = "a*.jar";
    115         String targetFileName1 = "*l*.jar";
    116         //因为FileFinder.findfiles(...)返回的是一个static的变量,所以引用static的方法也需要是static状态的
    117         List fileList = FileFinder.findfiles(baseDIR, targetFileName1, 8);
    118         FileFinder.printArrayList(fileList);
    119         
    120     }
    121     
    122     
    123 }
    1 执行结果:
    2 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
    3     at java.lang.String.charAt(String.java:658)
    4     at com.test.FileFinder.wildcardMatch(FileFinder.java:90)
    5     at com.test.FileFinder.findfiles(FileFinder.java:38)
    6     at com.test.FileFinder.main(FileFinder.java:117)
      1 package com.test;
      2 
      3 import java.io.File;
      4 import java.util.ArrayList;
      5 import java.util.List;
      6 
      7 import com.arraySet.Queue;
      8 
      9 /**
     10  * 查找给定的路径baseDirName下匹配符合targetFileName格式的count个文件
     11  * @author Administrator
     12  *
     13  */
     14 public class FileFinder {
     15     public static List findfiles(String baseDirName,String targetFileName,int count){
     16         List fileList = new ArrayList();
     17         File baseDir = new File(baseDirName);
     18         
     19         if(!baseDir.exists() || !baseDir.isDirectory()){
     20             System.out.println("文件查找失败:"+baseDirName+"不存在或者不是目录!");
     21             return fileList;
     22         }
     23         Queue queue = new Queue();
     24         //用于临时保存队列文件夹中的文件名
     25         String tempName = null;
     26         queue.add(baseDir);
     27         //外层循环
     28         while(!queue.isEmpty()){
     29             File tempFile = (File)queue.pop();
     30             if(tempFile.exists() && tempFile.isDirectory()){
     31                 File[] files = tempFile.listFiles();
     32                 for(File file:files){
     33                     if(file.isDirectory()){
     34                         queue.add(file);
     35                     }else{
     36                         tempName = file.getName();
     37                         //判断文件名与表达式是否匹配
     38                         if(FileFinder.wildcardMatch(targetFileName, tempName)){
     39                             fileList.add(file.getAbsolutePath());
     40                             if((count!=0) && fileList.size()>=count){
     41                                 //退出整个外部循环
     42                                 return fileList;
     43                             }
     44                         }
     45                     }
     46                 }
     47             }
     48         }
     49         return fileList;
     50     }
     51     
     52     /**
     53      * 遗留问题:在类方法中的全局变量patternLength、strLength、tempLength,在嵌套循环中被调用,
     54      * 方法中的全局如何分别存储方法加载的值和嵌套循环的值
     55      * 
     56      * private方法不提供给外部类调用,仅提供类内部方法调用,由于是static状态的,所以提供给内部static状态的方法调用
     57      * private方法不能调用任何方法
     58      * @param pattern
     59      * @param str
     60      * @return
     61      */
     62     private static boolean wildcardMatch(String pattern, String str){
     63         
     64         int patternLength = pattern.length();
     65         int strLength = str.length();
     66         int tempLength = 0;
     67         char ch;
     68 //        System.out.print("patternLength:"+patternLength+"	"+"strLength:"+strLength+"	");
     69         for(int patternIndex=0;patternIndex < patternLength;patternIndex++){
     70             ch = pattern.charAt(patternIndex);
     71             if(ch=='*'){
     72                 //*后面的字符串直到匹配到最后找到匹配为止,截取字符串从下标0开始,而字符串长度从1开始
     73                 while(tempLength < (strLength-1)){
     74 //                    System.out.println("tempLength1:"+tempLength);
     75 //                    System.out.print(wildcardMatch(pattern.substring(patternIndex + 1), str.substring(tempLength))+"	");
     76                     //调用的时候pattern、str值为截取后的字符串,调用结束返回时恢复为方法加载的全局值
     77                     if(wildcardMatch(pattern.substring(patternIndex + 1), str.substring(tempLength))){
     78                         return true;
     79                     }
     80                     tempLength++;
     81 //                    System.out.println("tempLength2:"+tempLength);
     82                 }
     83             }else if(ch=='?'){
     84                 tempLength++;
     85                 if(tempLength > (strLength-1)){
     86                     return false;
     87                 }
     88             }else{
     89                 if((tempLength > (strLength-1)) || (ch!=str.charAt(tempLength))){
     90                     return false;
     91                 }
     92                 tempLength++;
     93             }
     94         }
     95         return (tempLength == strLength);
     96     }
     97     
     98     protected static void printArrayList(List list){
     99         if(list.size()==0){
    100             System.out.println("No file find!");
    101         }else{
    102             for(int i=0;i<list.size();i++){
    103                 System.out.println(list.get(i));
    104             }
    105         }
    106     }
    107 
    108     public static void main(String[] args) {    
    109         String baseDIR = "D:/software/jdk/jdk7/lib";
    110 //        String baseDIR = "D:/testfile";
    111 //        String targetFileName1 = "*.jar";
    112 //        String targetFileName1 = "?.jar";
    113 //        String targetFileName1 = "a*.jar";
    114 //        String targetFileName1 = "*a?.jar";
    115 //        String targetFileName1 = "?a*.jar";
    116 //        String targetFileName1 = "?*a.jar";
    117 //        String targetFileName1 = "a?*.jar";
    118         String targetFileName1 = "*b*.jar";
    119         //因为FileFinder.findfiles(...)返回的是一个static的变量,所以引用static的方法也需要是static状态的
    120         List fileList = FileFinder.findfiles(baseDIR, targetFileName1, 8);
    121         FileFinder.printArrayList(fileList);
    122         
    123     }
    124     
    125     
    126 }
    1 D:softwarejdkjdk7libmissioncontrolpluginscom.ibm.icu_52.1.0.v201404241930.jar
    2 D:softwarejdkjdk7libmissioncontrolpluginscom.jrockit.mc.browser.attach.ja_5.5.0.165303.jar
    3 D:softwarejdkjdk7libmissioncontrolpluginscom.jrockit.mc.browser.attach.zh_CN_5.5.0.165303.jar
    4 D:softwarejdkjdk7libmissioncontrolpluginscom.jrockit.mc.browser.attach_5.5.0.165303.jar
    5 D:softwarejdkjdk7libmissioncontrolpluginscom.jrockit.mc.browser.ja_5.5.0.165303.jar
    6 D:softwarejdkjdk7libmissioncontrolpluginscom.jrockit.mc.browser.jdp.ja_5.5.0.165303.jar
    7 D:softwarejdkjdk7libmissioncontrolpluginscom.jrockit.mc.browser.jdp.zh_CN_5.5.0.165303.jar
    8 D:softwarejdkjdk7libmissioncontrolpluginscom.jrockit.mc.browser.jdp_5.5.0.165303.jar
  • 相关阅读:
    面向对象深入:继承01——子类
    面向对象的基础知识——小结
    IP地址配置
    二、RPM包管理-rpm命令管理
    一、软件包管理简介
    关机重启命令
    网络命令
    权限管理命令
    字符截取命令
    shell-正则表达式(二)
  • 原文地址:https://www.cnblogs.com/celine/p/8996894.html
Copyright © 2020-2023  润新知