import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.regex.Pattern; public class InsertLogIntoFile { private static List<String> list = new LinkedList<>(); private static final String resourceLocation = "/H:/git_studyspace/spring/src/main/java/org"; private static final String loggerPath = "lsh.spring.util.Log.info();"; private static final String methodMarks = "byte,short,int,long,float,double,boolean,char,void"; public static void main(String[] args) { readJavaFile(new File(resourceLocation)); } public static String getCurrentPath(Class<?> clazz) { return clazz.getResource(".").getPath(); } private static void readJavaFile(File file) { if(file.isDirectory()) { File[] files = file.listFiles(); for (File unit : files) { if(unit.isFile()) {//如果是文件,则进行进一步的编辑 if(unit.getName().endsWith("InsertLogIntoFile.java") || unit.getName().contains("AddLogToFile.java") || unit.getName().contains("Log.java")) { continue; } judgeLineByLine(unit.getAbsolutePath()); }else { readJavaFile(unit); } } }else { if(file.getName().endsWith("InsertLogIntoFile.java") || file.getName().contains("AddLogToFile.java") || file.getName().contains("Log.java")) { return; } judgeLineByLine(file.getAbsolutePath()); } } private static void judgeLineByLine(String file) { BufferedReader br = null; try { //先将文件都按行读取到缓存中 br = new BufferedReader(new FileReader(file)); String line = null; while((line = br.readLine()) != null) { list.add(line); } br.close(); //从缓存中读取文件内容时按需要修改内容,重新写入到文件当中 BufferedWriter bw = null; bw = new BufferedWriter(new FileWriter(file)); for (String string : list) { if(file.endsWith(".java")) { String newLine = judgeMethodLocation(string); bw.write(newLine); bw.write(" "); }else { bw.write(string); bw.write(" "); } } list.clear(); bw.write(" "); bw.flush(); bw.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //判断方法签名所在行,如果是方法签名,则在下一行插入日志并返回字符串 private static String judgeMethodLocation(String str) { if(!(str.trim().contains("(")&&str.contains(")")&&str.contains("{")&&!str.contains("}"))||str.trim().startsWith("//")) { return str; } String[] arr = str.split("[(]"); int mark = str.indexOf("("); //如果按照“(”进行字符串拆分得到的长度不小于2,且原字符串中字符“(”的前一个字符不为空 if(arr.length == 2 && (str.toCharArray()[mark-1] !=' ')) { String[] arr2 = arr[arr.length-2].split(" "); int length2 = arr2.length; if(startWithLowerCase(arr2[length2 - 1]) &&length2 >= 2 && (startWithUpperCase(arr2[length2-2]) || matchBasicType(arr2[length2-2]))) { return insertLoggerCommand(str); } } return str; } private static boolean startWithUpperCase(String str) { if(str.trim().length() == 0) { return false; } String regex = "[A-Z]"; Pattern p = Pattern.compile(regex); return p.matcher(str.substring(0, 1)).matches(); } private static boolean startWithLowerCase(String str) { if(str.trim().length() == 0) { return false; } String regex = "[a-z]"; Pattern p = Pattern.compile(regex); return p.matcher(str.substring(0, 1)).matches(); } public static boolean matchBasicType(String str) { String[] arr = methodMarks.split(","); for (String string : arr) { if(string.equals(str) || (string+"[]").equals(string)) { return true; } } return false; } //插入日志 private static String insertLoggerCommand(String lineStr) { StringBuilder sb = new StringBuilder(lineStr); sb.append(" ") .append(loggerPath); return sb.toString(); } }
import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; public class Log { private static int count = 0; private static PrintStream ps = null; static { try { ps = new PrintStream(new File("beanDefinitionLoad.md")); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { } public static void info() { StackTraceElement[] ste = new Exception().getStackTrace(); String className = ste[1].getClassName(); String methodName = ste[1].getMethodName(); int lineNumber = ste[1].getLineNumber(); StringBuilder sb = new StringBuilder(); for (int i=0; i <= count; i++) { sb.append(" "); } count++; ps.println(sb+"["+className+"."+methodName+": "+lineNumber+"]"); if(count == 30) { count = 0; } } public static void info(String str) { StackTraceElement[] ste = new Exception().getStackTrace(); String className = ste[1].getClassName(); String methodName = ste[1].getMethodName(); int lineNumber = ste[1].getLineNumber(); StringBuilder sb = new StringBuilder(); for (int i=0; i <= count; i++) { sb.append(" "); } count++; System.out.println(sb+"["+className+"."+methodName+": "+lineNumber+"] "+str); if(count == 30) { count = 0; } } }