代码:
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 查找一个Java源文件中的成员函数名 * */ public class FindFunctionNames { public static void main(String[] args) { // (\\w+):group(1) 匹配public/protected/private // (\\s+):group(2) 匹配一个或多个空格 // (\\w+):group(3) 匹配返回值如void,String // (\\s+):group(4) 匹配一个或多个空格 // ([_a-zA-Z]+[_a-zA-Z0-9]*):group(5) 匹配函数名 // ([(]([^()]*)[)]):group(1) 匹配函数的参数 java.util.regex.Pattern pattern=Pattern.compile("(\\s+)(\\w+)(\\s+)(\\w+)(\\s+)([_a-zA-Z]+[_a-zA-Z0-9]*)([(]([^()]*)[)])"); try (LineNumberReader lineNumberReader = new LineNumberReader(new FileReader("D:\\logs\\AllocationRequestFileToDbJob.java"));){ String line = null; while ((line = lineNumberReader.readLine()) != null) { Matcher matcher=pattern.matcher(line); while(matcher.find()) { System.out.println("Line " + lineNumberReader.getLineNumber() +":" + matcher.group(6)+ matcher.group(7)); } } } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }
输出:
Line 52:run() { Line 93:truncateTable() throws SQLException{ Line 108:insertTestDataTo() throws SQLException{ Line 160:getInsertSql(String tableName,List<TypeField> typefields,int index,int interval) { Line 202:getDatetimeBefore(int n,int interval) { Line 225:sec2DHMS(long secondCount) {
源文件:
package test.threadinsert; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import org.apache.log4j.Logger; /** * Used a thread to insert records to a table * * */ public class ThreadInserter extends Thread{ private static Logger log = Logger.getLogger(ThreadInserter.class); private static final int BatchSize=500; private int tbSN; // Table's serial number private String tableName; // Tbale's name private int count; // how many records should be inserted private String[] innerArr; // array contains table types/fields private Connection conn; // Connection used in single thread private Statement stmt; // statemenet used in single throead private int times; // How many times this thread should run private InserterManager manager;// Reference to manager /** * Constructor * @param tbSN * @param tableName * @param count * @param innerArr */ public ThreadInserter(int tbSN,String tableName,int count,String[] innerArr,InserterManager manager) { this.tbSN=tbSN; this.tableName=tableName; this.count=count; this.innerArr=innerArr; this.times=count/BatchSize; this.manager=manager; } /** * thread method */ public void run() { try { log.info("Start..."); long startTime = System.currentTimeMillis(); // Initialize conn/stmt DbParam_Dev dbParam=new DbParam_Dev(); Class.forName(dbParam.Driver).newInstance(); conn = DriverManager.getConnection(dbParam.DbUrl, dbParam.User, dbParam.Pswd); stmt = conn.createStatement(); // Clear truncateTable(); // Insert insertTestDataTo(); long endTime = System.currentTimeMillis(); String timeElasped=sec2DHMS((endTime - startTime)/1000); log.info("#"+tbSN+" End. "+count+" records have been inserted to '"+tableName+"'.( time elapsed: " + timeElasped +")"); /// manager.reportFinished(String.valueOf(tbSN), tableName, timeElasped); }catch(Exception ex) { ex.printStackTrace(); } finally { try { stmt.close(); conn.close(); } catch (SQLException e) { System.out.print("Can't close stmt/conn because of " + e.getMessage()); } } } /** * 清空一个表的数据,注意此功能有破坏性,不可恢复,注意备份好数据 * @param tableName * @param conn * @param stmt * @throws SQLException */ private void truncateTable() throws SQLException{ String sql="truncate table "+tableName; stmt.execute(sql); log.info("truncated table:"+tableName); } /** * 向一个表插入数据 * @param tableName * @param count * @param innerArr * @param conn * @param stmt * @throws SQLException */ private void insertTestDataTo() throws SQLException{ // 得到字段名和字段类型 List<TypeField> typefields=new ArrayList<TypeField>(); for(int i=1;i<innerArr.length;i++) { String temp=innerArr[i]; String[] arrTmp=temp.split(":"); TypeField tf=new TypeField(); tf.type=arrTmp[0]; tf.field=arrTmp[1]; typefields.add(tf); } List<String> fields=new ArrayList<String>(); List<String> values=new ArrayList<String>(); int index=0; for(TypeField tf:typefields) { fields.add(tf.field); values.add("''{"+index+"}''"); index++; } int interval=2*365*24*60*60/count;// 两年的秒数除以总个数即为间隔 index=0; //int times=count/BatchSize; for(int i=0;i<this.times;i++) { StringBuilder sb=new StringBuilder(); sb.append("INSERT ALL "); for(int j=0;j<BatchSize;j++) { index=i*BatchSize+j; sb.append(getInsertSql(tableName,typefields,index,interval)); } sb.append(" select * from dual"); String sql = sb.toString(); long startTime = System.currentTimeMillis(); stmt.executeUpdate(sql); long endTime = System.currentTimeMillis(); log.info("#"+tbSN+"-("+i+"/"+this.times+") "+BatchSize+" records inserted to '"+tableName+"' used " + sec2DHMS((endTime - startTime)/1000)); } } /** * 得到批量插入语句 * @param tableName * @param typefields * @param index * @return */ private String getInsertSql(String tableName,List<TypeField> typefields,int index,int interval) { String currTime=getDatetimeBefore(index,interval); StringBuilder sb=new StringBuilder(); sb.append(" INTO "+tableName+"("); List<String> fields=new ArrayList<String>(); for(TypeField tf:typefields) { fields.add(tf.field); } sb.append(String.join(",",fields)); sb.append(") values("); List<String> values=new ArrayList<String>(); for(TypeField tf:typefields) { if(tf.type.equals("PK")) { //values.add("'"+String.valueOf(index)+"'"); if(tableName.contains("DELIVERY_INFO_HISTORY")) { values.add("'0'"); }else { values.add("'"+String.valueOf(index)+"'"); } }else if(tf.type.equals("CH")) { values.add("'0'"); }else if(tf.type.equals("US")) { values.add("'heyang'"); }else if(tf.type.equals("DT")) { values.add("to_date('"+currTime+"','yyyy-MM-dd HH24:mi:ss')"); } } sb.append(String.join(",",values)); sb.append(")"); String insertSql=sb.toString(); return insertSql; } /** * 以当前时间为基准减去数十秒 * @param n * @return */ private static String getDatetimeBefore(int n,int interval) { try { Calendar now = Calendar.getInstance(); now.add(Calendar.SECOND,-n*interval);//日期减去n*10秒 Date newDate=now.getTime(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String retval = sdf.format(newDate); return retval; } catch(Exception ex) { ex.printStackTrace(); return null; } } /** * 将秒转化为日时分秒 * @param secondCount * @return */ private static String sec2DHMS(long secondCount) { String retval = null; long days = secondCount / (60 * 60 * 24); long hours = (secondCount % (60 * 60 * 24)) / (60 * 60); long minutes = (secondCount % (60 * 60)) / 60; long seconds = secondCount % 60; String strSeconds=""; if(seconds!=0) { strSeconds=seconds + "s"; } if (days > 0) { retval = days + "d" + hours + "h" + minutes + "m" + strSeconds; } else if (hours > 0) { retval = hours + "h" + minutes + "m" + strSeconds; } else if (minutes > 0) { retval = minutes + "m" + strSeconds; } else { retval = strSeconds; } return retval; } }
--END-- 14:27