模拟类似linux:find . -name "*.*" |xargs grep -i "搜索字符串"

来源:互联网 发布:javascript eval json 编辑:程序博客网 时间:2024/06/05 00:53

package com.util.exam;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FindOneStrOnFile {

    /**
     * @param args
     */
    public static List iterator(String path,String[] regs){
        List result=new ArrayList();
        File f=new File(path);
        File[] fs=f.listFiles();
        int count=0;
        String tongjijieguo="";
        for(int i=0;i<fs.length;i+=1){
            File ff=fs[i];
            if(ff.isDirectory()){
                //iterator(ff.getPath(),regs);
                continue;
            }
            boolean flag=false;
            for(int j=0;j<regs.length;j+=1){
                count=find(ff,regs[j]);
                tongjijieguo=regs[j]+"出现次数:"+count+";";
                if(count!=0){
                    flag=true;
                }else{
                    flag=false;
                    break;
                }
            }
            if(flag){
                result.add(ff.getPath()+":   "+tongjijieguo);
            }
        }
        return result;
    }
    private static int find(File file,String reg){
        FileInputStream fis=null;
        BufferedReader br=null;
        String sbf = "";
        int count=0;
        try{
            fis=new FileInputStream(file.getPath());
            br=new BufferedReader(new InputStreamReader(fis));
            String line=null;
           
            while((line=br.readLine())!=null){
                sbf=sbf+""+line;
            }
            Pattern p = Pattern.compile(reg);
            Matcher m = p.matcher(sbf);
            while (m.find()) {
                count++;
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(br!=null)try{br.close();}catch(Exception e){}
            if(fis!=null)try{fis.close();}catch(Exception e){}
        }
        return count;
    }
   
    public static List iteratorDetail(String path,String[] regs){
        List result=new ArrayList();
        File f=new File(path);
        File[] fs=f.listFiles();
       
        for(int i=0;i<fs.length;i+=1){
            String detailMsg="";
            String detailMsgAll="";
            File ff=fs[i];
            if(ff.isDirectory()){
                List l=iteratorDetail(ff.getPath().replaceAll("////","////////"),regs);
                result.addAll(l);
                continue;
            }
            boolean flag=false;//匹配标识
            for(int j=0;j<regs.length;j+=1){
                detailMsg=findDetail(ff,regs[j]);
                detailMsgAll=detailMsgAll+detailMsg;
                if(!detailMsg.equals("")){
                    flag=true;
                }else{
                    flag=false;
                    break;
                }
               
            }
            if(flag){
                String[] detail=detailMsgAll.split("~");
                for(int k=0;k<detail.length;k++){
                    result.add(ff.getPath()+":      "+detail[k]);
                }
            }
        }
       
        return result;
    }
    private static String findDetail(File file,String reg){
        FileInputStream fis=null;
        BufferedReader br=null;
        String detailMsg="";
        try{
            fis=new FileInputStream(file.getPath());
            br=new BufferedReader(new InputStreamReader(fis));
            String line=null;
            int count=1;
            while((line=br.readLine())!=null){
                if(line.matches(".*"+reg+".*")){
                    detailMsg=detailMsg+"行号:"+count+"        "+line+"~";
                }
                count++;
            }
       
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(br!=null)try{br.close();}catch(Exception e){}
            if(fis!=null)try{fis.close();}catch(Exception e){}
        }
        return detailMsg;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String[] regs={"str"};//支持多项查询
        String path="C://Documents and Settings//Administrator//桌面//cs";//父目录
        List l=iterator(path,regs);
        for(int i=0;i<l.size();i++){
            System.out.println(l.get(i));
        }
        List l1=iteratorDetail(path,regs);
        for(int i=0;i<l1.size();i++){
            System.out.println(l1.get(i));
        }
    }

}

 

---------------------------------------------知识点归总------------------------------------------

 

1 将windows系统路径的单斜杠替换成双斜杠以满足java语法需要

string.replaceAll("////","////////");

2 利用java正则类匹配字符:

    Pattern p = Pattern.compile(reg);
     Matcher m = p.matcher(sbf);
     while (m.find()) {
            count++;
     }

3 递归调用文件目录

 

原创粉丝点击