package com.lesso.common.util;
import java.io.*;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FindFile {
static int fileCount = 0;//文件总数
static int wrong = 0;//含有中文字符的文件数
static String regEx = "[\u4e00-\u9fa5]"; //匹配中文正则
static Pattern pat = Pattern.compile(regEx);
static FileOutputStream fos = null;
static OutputStreamWriter osw = null;
public static void main(String[] args) {
Scanner sc = null;
//long a = System.currentTimeMillis();
try {
//每次重新执行的时候删除上次写入的文件
File file = new File("D:\\翻译截取文档\\FileCH9_25_PM.txt");
file.delete();
System.out.println("输入文件路径: ");
//读取输入的路径
// sc = new Scanner(System.in);
// String filePath = sc.nextLine();
// String filePath = "F:\\IdeaProject\\channel-system\\src\\main\\java\\com\\lesso";
// E:\workspaces\channel-system\src\main\java\com\lesso ;;;E:\workspaces\channel-system\src\main\resources\mapper
// String filePath ="E:\\workspaces\\channel-system\\src\\main\\java\\com\\lesso";
// String filePath ="E:\\9_20";
String filePath ="D:\\eclipse\\workspace\\channel-system\\src\\main\\java";
//打开输出流
fos = new FileOutputStream(new File("D:\\翻译截取文档\\FileCH9_25_PM.txt"), true);
osw = new OutputStreamWriter(fos, "UTF-8");
//refreshFileList("f:\\wk");
//开始检查文件
Set setChose = new TreeSet();
refreshFileList(filePath,setChose);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
osw.close();
sc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//refreshFileList("E:\\workspace\\test\\ognl\\enhance");
//System.out.print("运行时间为 ");
//System.out.println(System.currentTimeMillis() - a);
//输出检查结果
System.out.println("处理了" + fileCount + " 个文件" + wrong + "包含的字符已存储到f:\\FileCH.txt文件");
}
//递归查找文件
private static void refreshFileList(String strPath,Set setChose) throws IOException {
File dir = new File(strPath);
File[] files = dir.listFiles();
if (files == null)
return;
for (int i = 0; i < files.length; i++) {
System.out.println("第" + i + "个文件");
int flag = 0;
if (files[i].isDirectory()) {
refreshFileList(files[i].getAbsolutePath(),setChose);
} else {
fileCount++;
String strFileName = files[i].getAbsolutePath().toLowerCase();
//System.out.println(getFileEncode(files[i].getAbsolutePath())+" ----" +files[i].getName());
//截取文件格式
String fileName = strFileName.substring(strFileName.lastIndexOf(".") + 1, strFileName.length());
// //排除不需要扫描的文件
if (fileName.equals("rar") || fileName.equals("jpg") || fileName.equals("png") || fileName.equals("jar") || fileName.equals("doc") || fileName.equals("xls") || fileName.equals("gif") || fileName.equals("wmz") || fileName.equals("sql")) {
continue;
}
// if (!fileName.equals("js")) {
// continue;
// }
//不知为何 两种方法判断的时候都会吧class文件和jar文件当做是含有中文字符的文件
//所以此处排除掉这class文件和jar文件不参与判断
if (!"class".equals(fileName.toLowerCase())) {
//开始输入文件流,检查文件
// String enCode = getFileEncode(files[i].getAbsolutePath());
// if ("void".equals(enCode)) {
// enCode = "UTF-8";
// }
// if ("windows-1252".equals(enCode)) {
// enCode = "GBK";
// }
String enCode="UTF-8";
FileInputStream fis = new FileInputStream(files[i].getAbsolutePath());
InputStreamReader in = new InputStreamReader(fis, enCode);
BufferedReader br = new BufferedReader(in);
//用于记录行数 确定文件哪一行有中文
int lineCount = 0;
String line = null;
//逐行检查文件
while ((line = br.readLine()) != null) {
/使用正则表达式进行判断
lineCount++;
//line.trim().indexOf("*")==0 || line.trim().indexOf("/")==0 ||
if( line.trim().indexOf("@ApiModelProperty")==0
|| line.trim().indexOf("@ApiOperation")==0 || line.trim().indexOf("@Api")==0 || line.trim().indexOf("logger.info")==0
|| line.trim().indexOf("*")!=-1 || line.trim().indexOf("//")!=-1 || line.trim().indexOf("@ApiParam")!=-1
){
continue;
}
// if(
// line.trim().indexOf("//")!=-1 || !line.trim().contains("content:")
// ){
// continue;
// }
// if(
// line.trim().indexOf("//")!=-1 || !line.trim().contains("toastSvc.show") //!line.trim().contains("headerName:")
// ){
// continue;
// }
String s = "^[\\u4e00-\\u9fa5]";
Pattern p = Pattern.compile("[\\u4e00-\\u9fa5]");
Matcher m = p.matcher(line);
boolean b = m.find();
if (!m.find()) {
continue;
}
String substring = line.trim();
// int i1 = line.length() - line.replaceAll("\"", "").length();
// if(i1<=2){
// continue;
// }
// if(line.contains("println") || line.contains("log.info") || line.contains("log.error")){
// continue;
// }
// if(!line.contains("+") && !line.contains("getLangName")){
// continue;
// }
// substring = line.trim();
// int i1 = line.indexOf("headerName:");
// int ii = line.indexOf(",",i1+1);
// //int ii = -1;
// if(ii==-1){
// ii = line.indexOf("\'",i1+1);
// if(ii==-1){
// ii = line.indexOf("\"",i1+1);
// ii = line.indexOf("\"",ii+1);
// }else{
// ii = line.indexOf("\'",ii+1);
// }
// substring = line.substring(i1, ii+1);
// }else {
// substring = line.substring(i1, ii);
// }
//
// int i2 = substring.indexOf(":");
// String substring1 = substring.substring(i2+1);
// substring1 = substring1.replaceAll("\'","").replaceAll("\"","").replaceAll("}","").trim();
// substring = substring1;
// int i1 = line.indexOf("\'");
// int ii = line.indexOf("\"");
//
// if(i1==-1){
// if(ii ==-1){
// continue;
// }else {
// int ii2 = line.lastIndexOf("\"");
// substring = line.substring(ii + 1, ii2);
// }
//
// }else {
// int i2 = line.lastIndexOf("\'");
// substring = line.substring(i1 + 1, i2);
// }
// if(ii == -1){
// continue;
// }
// int ii2 = line.lastIndexOf("\"");
// substring = line.substring(ii + 1, ii2);
// if(i1 == -1){
// continue;
// }
// int i2 = line.lastIndexOf(")");
// substring = line.substring(i1 + 1, i2);
//
// String ss = substring.trim().substring(1,substring.length());
if(!setChose.add(substring)) continue;
int i3 = strFileName.lastIndexOf("\\");
osw.write(substring+"===============文件名:"+strFileName.substring(i3+1)+"=========================="+lineCount+"\r\n");
//osw.write(substring+"\r\n");
osw.flush();
flag++;
// char[] charArray = line.toCharArray();
// for (int k = 0; k < charArray.length; k++) {
// if ((charArray[k] >= 0x4e00) && (charArray[k] <= 0x9fbb)) {
// //每行进行扫描,用正则判断含有中文的行
// Pattern p = Pattern.compile("([\u4e00-\u9fa5]+)");
// String mv = "";
// //正则判断
// Matcher m = p.matcher(line);
// //遍历含有中文的行。并取出中文
// while (m.find()) {
// mv += m.group(0);
// }
// if(!setChose.add(mv)){
// continue;
// }
// //将含有中文的文件名称和中文所在行数写入文件夹
osw.write(files[i].getAbsolutePath() + " ------- 第" + lineCount + "行<===>" + mv + "\r\n");
// osw.write(mv + "\r\n");
// osw.flush();
// flag++;
// //wrong++;
// if (flag != 0) k = charArray.length;
// }
//
// }
}
//flag!=0 说明该文件中含有中文
if (flag != 0) wrong++;
br.close();
in.close();
fis.close();
}
}
}
System.out.println(45646);
}
//检查文件类型
// public static String getFileEncode(String path) {
// /*
// * detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
// * cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、
// * JChardetFacade、ASCIIDetector、UnicodeDetector。
// * detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的
// * 字符集编码。使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
// * cpDetector是基于统计学原理的,不保证完全正确。
// */
// CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
// /*
// * ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
// * 指示是否显示探测过程的详细信息,为false不显示。
// */
// detector.add(new ParsingDetector(false));
// /*
// * JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码
// * 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以
// * 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。
// */
// detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
// // ASCIIDetector用于ASCII编码测定
// detector.add(ASCIIDetector.getInstance());
// // UnicodeDetector用于Unicode家族编码的测定
// detector.add(UnicodeDetector.getInstance());
// java.nio.charset.Charset charset = null;
// File f = new File(path);
// try {
// charset = detector.detectCodepage(f.toURI().toURL());
// } catch (Exception ex) {
// ex.printStackTrace();
// }
// if (charset != null)
// return charset.name();
// else
// return null;
// }
}
抓取代码里中中文
最新推荐文章于 2021-02-24 19:13:23 发布