.java编写库关键字搜索----针对js等库

今天开始分析 DWZ框架的源代码,发现单单从txt来看实在是不好分析,各种函数都不是到是哪里定义的...
因为javascript的函数定义方法不像java C++等语言有固定的语法,可以模糊匹配 ..
对于js这样的 函数只能通过关键字搜索代码如下 直接 javac  java就可以运行 
   import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * js文件关键字批量搜索.. 
 * 初衷是搜索js..可以针对于所有类型可读文件
 * 可以从一个path下的js文件中定位指定关键字.....
 * 在分析大规模的js库的时候可以方便定位关键字所在位置..
 * @author 岳东卫
 */
public class JFunctionFinder {  
 
 public JFunctionFinder() {
  
  }
 /**
  * 存放搜索结果集合
  */
 private Collection<String> col=new ArrayList<String>() ;
 
   /**返回库目录下所有js文件
    * @param path  js文件所在的路径
    * @return 一个目录下的所有文件内容
    * @throws Exception
    */
   private   static  File[] getFile(String  path) throws Exception{
    File f =null;
    try{
    f=new  File(path) ;
    }catch (Exception e) {
  throw new Exception("路径不存在",e) ;
 } 
 return f.listFiles() ;  //js文件集合
   }
  
   /**
    * 递归遍历
    * @param  files  getFile结果   一个File数组
    * @param  functionName   要搜索的关键字名字..严格区分大小写
    * @return 返回一个function所在位置的集合... 
    * @throws IOException
    */
   private void getFunctionLocation(File[]files,String functionName) throws IOException {
    for(File f:files){ 
    
   //如果是文件夹 那么递归
     if(f.isDirectory()){  
          try {
       File []tem=getFile(f.getPath()) ;
       this.getFunctionLocation(tem, functionName) ;
          } catch (Exception e) {
        e.printStackTrace();
         }
     }
    
     //如果是普通js文件
     else{
      InputStream is=new FileInputStream(f) ;
      byte []bt=new byte[is.available()]; 
      is.read(bt) ;
      String contents=new String(bt) ;//默认unicode编码..   
      Pattern p=Pattern.compile(functionName,Pattern.MULTILINE) ;  
      Matcher m=p.matcher(contents) ;
      if(m.find()){
       col.add("["+new String(f.getName())+"]\n") ;
      }
     
       }   
    }
   }
   
   /**
    * 返回搜索结果
    * @return
    */
   public Collection<String> getResult(){
    return this.col ;
   }
  
   /**
    * 只需要调用这个函数开始搜索就行.,
    * @param path   搜索路径如  D:\lib
    * @param functionName 函数名字 严格区分大小
    * @return 返回搜索结果的集合 ...
    */
   public Collection<String>  beginSearch(String  path,String functionName){  
    this.col.add("存在"+functionName+"的库文件是:") ;
    try {
  File []f=getFile(path) ; 
  this.getFunctionLocation(f, functionName) ; 
 } catch (Exception e) {
  e.printStackTrace();
 }
 return col; 
   }
   public static void main(String[] args) throws IOException, Exception {
  
   JFunctionFinder f=new JFunctionFinder() ;  //创建一个对象 
   System.out.println("请输入库文件的路径:");
   String path=(new Scanner(System.in)).next() ;  //输入路径 如: d:\lib
   System.out.println("输入关键字:");
   String key=(new Scanner(System.in)).next() ;  //输入路径 如: d:\lib
   Collection<String> c=f.beginSearch(path, key) ;//返回存在关键字的集合
   for(String s:c){
    System.out.print(s);
   }
  }
 }
上一篇:使用nginx后让tomcat的localhost_access_log获得真实IP


下一篇:2分钟快速学会称重传感器产生故障后怎么解决?