java 多线程查找文件夹下所有文件中指定的字符串

--SearchFile .java-----------------------------------------------------------------------------
import java.io.File;
import java.io.FileFilter;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 小程序:查找java文件中未国际化的字符串
 * @author zz
 *
 */
public class SearchFile {
    private static Logger logger = LoggerFactory.getLogger(FindTask.class);
    private static ThreadPoolExecutor threadPool = null;
    
    
    //过滤文件类型
    private static FileFilter ff = new FileFilter() {
        public boolean accept(File pathname) {
            String pathl = pathname.getName().toLowerCase();
            //只匹配 .java 结尾的文件
            if (pathname.isDirectory() || pathl.endsWith(".java")) {
                return true;
            }
            return false;
        }
    };
    
    private static void findFileStr() {
        String[] args = new String[] {
                 "//$NON-NLS-1$",                                 //需要查找的字符串信息
                 "E:\\his_leopard\\leopard\\branches\\dev\\",    //查找该路径下的所有文件
                 "E:/workdoc/20120210/rs.log",                     //查找到符合条件的信息输出到日志
                 "8",                                            //线程池大小
                 };
                
        if(args == null || args.length < 2) {
            logger.info("请输入.java文件路径和要查找的内容 例如 " +
                    "D:\\soft_pro\\his_dev_refactor\\ " +
                    "extends eHealthFormPage " +
                    "d:/logs");
            return;
        }
        String text = args[0];
        String root = args[1];
        
        File rsFile = new File("rs.txt"); //默认输出的文件名
        int threadnum = 10;
        if (args.length >= 3) { //如果指定了查找结果的输出文件名
            rsFile = new File(args[2]);
            rsFile.getParentFile().mkdirs();
        }
        
        if (args.length >= 4) { //如果指定了分配线程的个数
            try {
            threadnum = Integer.valueOf(args[3]);
            }
            catch (Exception ex) {
            }
        }
        
        //初始化线程池
        threadPool = new ThreadPoolExecutor(threadnum,
                        threadnum * 2, 6,
                        TimeUnit.SECONDS,
                        new ArrayBlockingQueue(1000),
                        new ThreadPoolExecutor.
                        DiscardOldestPolicy());
        File f = new File(root);
        logger.info("\n");
        logger.info("开始进行查找的时间:" + System.currentTimeMillis());
        logger.info("\n");
        findText(text, f, rsFile);
        threadPool.shutdown(); //关闭线程池
    }
    
    /**
     * 查找字符串在文件中的位置
     *
     * @param text   需要查找的字符串信息
     * @param f       所在的文件
     * @param rsFile 输出到指定的文件
     */
    public static void findText(String text, File f, File rsFile) {
        if (f.exists()) {
            if (f.isDirectory()) {
                for (File fs : f.listFiles(ff)) {
                    findText(text, fs, rsFile);
                }
            }else {
                threadPool.execute(new FindTask(text, f, rsFile));
            }
        }else {
            logger.info("\n");
            logger.info(f + "不存在!");
            logger.info("\n");
        }
    }
    
    public static void main(String[] args) {
        SearchFile sf = new SearchFile();
        sf.findFileStr();
    }
    
}


-FindTask .java--------------------------------------------------------------------------

/**
 *
 */
package tools.icd.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 执行查找任务
 * @author zz
 */
public class FindTask implements Runnable {
    private static Logger logger = LoggerFactory.getLogger(FindTask.class);
    
    String text = "";
    File f = null;
    File rs = null;
    
    public FindTask(String text, File f, File rs) {
        this.text = text;
        this.f = f;
        this.rs = rs;
    }
    
    public void run() {
        boolean isfind = false;
        StringBuilder sb = new StringBuilder(800);
        sb.append("").append('\r').append('\n');
        sb.append("在文件").append(f.getAbsolutePath()).append("找到以下内容:").append('\r').append('\n');
        try {
            FileInputStream fis = new FileInputStream(f);
            InputStreamReader isr = new InputStreamReader(fis,Charset.forName("GBK")); //以gbk编码打开文本文件
            BufferedReader br = new BufferedReader(isr, 8192 * 8);
            String line = null;
            int linenum = 0;
            while ( (line = br.readLine()) != null) {//按行读取
                linenum++;
                if (line.indexOf(text) >= 0) {
                    //查找符合条件的字符串
                    isfind = findString(sb,line,linenum);
                }
            }
            
            if (isfind) {
                RandomAccessFile rsf = new RandomAccessFile(rs, "rw");
                FileChannel fc = rsf.getChannel();
                fc.force(true);
                FileLock fl = fc.lock();
                ByteBuffer bb = ByteBuffer.allocate(sb.length() * 2);
                bb.put(sb.toString().getBytes());
                bb.flip();
                fc.write(bb, rsf.length());
                fl.release();
                fc.close();
                rsf.close();
            }
            logger.info("\n");
            logger.info(Thread.currentThread().getName() + " 对 " + f + "处理完毕 at " + System.currentTimeMillis());
            logger.info("\n");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private boolean findString(StringBuilder sb,String line,int linenum) {
        boolean isfind = false;
        if(line != null && !line.equals("")) {
            if ((line.indexOf("Messages.getString") < 0) ) {
                //截取"("之后的字符串
                if (line.indexOf("(") >= 0 && line.indexOf(")") >= 0) {
                    String str1 = line.substring(line.indexOf("("),line.indexOf(")"));
                    if (str1.indexOf("\"") >= 0 && str1.lastIndexOf("\"") >0
                            && str1.lastIndexOf("\"") > str1.indexOf("\"")) {
                        String str2 = str1.substring(str1.indexOf("\"")+1, str1.lastIndexOf("\""));
                        if (!str2.equals("") && (str2.indexOf(".") <0) ) {
                            //判断字符串中含有中文字符串
                            Pattern   pa   =   Pattern.compile("[\u4E00-\u9FA0]");
                            Matcher   m   =   pa.matcher(str2);
                            boolean isok = m.find();
                            if(isok) {
                                isfind = true;
                                sb.append('第').append(linenum).append("行: ");
                                sb.append(line).append('\r').append('\n');
                            }
                        }
                    }
                }
            }
        }
        return isfind;
    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值