多谢啊...
大批量文件怎么实现才是做好的...

解决方案 »

  1.   

    实现的方式很多这要看实现的目标,是要低CPU还是短时间,还是其他什么目标
      

  2.   


    能说一下分别对于低CPU和短时间.都有什么实现方法吗?
      

  3.   

    在檔案內找到某字串的問題不難,但如果用轉成字串然後用 contains或 indexOf等方式去檢查的話,
    就必須考慮字串落在兩次讀取之間的情形,以及轉字串的時間。這是我以前寫的,你的問題蠻適用的。
    (沒空寫一個 PhoneNumberChacker,但規則類似,你可以參考我下面兩個checker自己寫。)public static void main(String[] args) {
      try{
      long s = (new Date()).getTime();
      FileInputStream fi = new FileInputStream(new File("fileName")); //要檢查的檔案
      StringChecker sc = new StringChecker("xxxxx"); //要檢查的字串
      byte[] bytes=new byte[64768];
      int ct=0;
      int x = 0;
      outter:
      while((ct = fi.read(bytes))>0){
        for(int i=0;i<ct;i++){
          if(sc.check((char)bytes[i])){
            System.out.println("Found at :"+(x*64768+i));  //實際位置要減去字串長度才對
            //break outter; //如果找到就不往下找,可以設中斷。
          }
        }
        x++;
      }
      fi.close();
      //實測結果 1.5G的檔案約 30秒
      System.out.println("Time:"+((new Date()).getTime() - s));
      }catch(Exception e){
        e.printStackTrace();
      }
    }
    主要規則:
    每次檢查一個字元,如果相符,則檢查位置加一,如果不相符,則檢查位置歸零。
    如果檢查位置比檢查字串還大,表示全字串相符,回傳true,並將檢查位置歸零,否則回傳 false。public class StringChecker {
      private int checkIndex = 0;
      private String pattern;
      public StringChecker(String pattern){
        this.pattern=pattern;
      }
      public boolean check(char c) {
        if(pattern.charAt(checkIndex) == c){
          checkIndex++;
        }else{
          checkIndex=0;
        }
        if(checkIndex==pattern.length()){
          checkIndex=0;
          return true;
        }else{
          return false;
        }
      }  
    }
    不分大小寫可以這樣做。public class IgnoreCaseStringChecker{
      private int checkIndex = 0;
      private String pattern_upper;
      private String pattern_lower;
      public StringChecker(String pattern){
        this.pattern_upper=pattern.toUpperCase();
        this.pattern_lower=pattern.toLowerCase();
      }
      public boolean check(char c) {
        if(pattern_upper.charAt(checkIndex) == c || pattern_lower.charAt(checkIndex)==c){
          checkIndex++;
        }else{
          checkIndex=0;
        }
        if(checkIndex==pattern_lower.length()){
          checkIndex=0;
          return true;
        }else{
          return false;
        }
      }  
    }