--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;
}
}