<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    太陽雨

    痛并快樂著

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      67 Posts :: 3 Stories :: 33 Comments :: 0 Trackbacks
    在前面的廢話不想看的可以skip-----由于工作需要,經常需要打開和查詢250M左右的文本文件(總行數超過250萬行)分析日志,公司發的筆記本內存才512M,地球人都知道,這樣的電腦根本不能勝任。不知道有沒有人和我一樣倒霉,面對這么龐大的文件,曾經讓我很無奈,很彷徨。從尋找優秀的類似notepad這樣的文本工具,企圖通過工具來提高下速度,其中JIURL這個記事本工具,我個人覺得很好,它陪我走了好長時間,雖然它老是有這樣那樣的BUG,不過它的速度確實比其他的記事本快很多,對于巨型文件,不會像其他記事本那樣直接掛死。工具再好,也是死的,經常操作一樣的動作,讓我想撞墻。偶又去研究了Linux下的sh命令,哎,不是我說MicroSoft的系統不好,Linux的命令確實好使,特別是查詢文檔,日志分析的時候,只要你使用的好,基本都能完成你的任務。像grep,gawk,wc,head,hail etc.這樣的命令總是能給我們帶來驚喜。Linux系統還是要好好學的,雖然和widows差別很大,但是很強,很方便。 下面我就來說說用JAVASE怎么操作這些龐然大物的。 先介紹下我要操作的文本文件 [28-03-2008 00:00:00.101] |SH1|CIC015|->|SH1|AG015| >>IAM|CN15|CD51001500|CG15921351879|PA0|PB1|<< [28-03-2008 00:00:00.101] |SH1|CIC153|->|SH1|AG144| >>IAM|CN144|CD51001500|CG13761957943|PA0|PB1|<< [28-03-2008 00:00:00.117] |SH1|CIC015|<-|SH1|AG015| >>ACM|CN15|<< [28-03-2008 00:00:00.117] |SH1|CIC153|<-|SH1|AG144| >>ACM|CN144|<< [28-03-2008 00:00:00.179] |SH1|CIC111|->|SH1|AG105| >>REL|CN105|PA16|PB0|PC4|<< [28-03-2008 00:00:00.179] |SH1|CIC111|<-|SH1|AG105| >>RLC|CN105|<< [28-03-2008 00:00:00.273] |SH1|CIC1373|->|SH3|AG118| >>ANM|CN118|<< [28-03-2008 00:00:00.383] |SH1|CIC1365|<-|SH3|AG110| >>REL|CN110|PA16|<< [28-03-2008 00:00:00.461] |SH1|CIC1365|->|SH3|AG110| >>RLC|CN110|<< [28-03-2008 00:00:00.586] |SH1|CIC2577|->|S11|AG196| >>ANM|CN196|<< 大家不要頭暈,這個本來就是日志,搞過No.7的人都看的懂,不過這個不是重點了。我們要處理就是這樣的文件,JAVASE里有一個新的包 java.nio,具體干啥的,我就不說了,自己去查看API吧。下面貼出具體代碼,大家重點看getResult() 方法。在里面使用了MappedByteBuffer把文件映射到內存里面去,然后使用緩存的技術把他再讀出來,如果不適用緩存,速度會很慢,想在這個里面查個東西,至少要7分鐘以上,使用了緩存整個文件遍歷最多13秒,差距很大吧,這個時間還是和硬件有關系的,我的電腦比較爛了,我老婆經常說我的是“低廉的雙核”,我那個汗啊!o(∩_∩)o...,大家好好看看里面的代碼吧。希望能對經常和大型文件打交道的人有個幫助!

      1 package com.xhp.ss7 ;    
      2    
      3 import java.io.File ;    
      4 import java.io.RandomAccessFile ;    
      5 import java.io.BufferedReader ;    
      6 import java.io.StringReader ;    
      7 import java.util.List ;    
      8 import java.util.ArrayList ;    
      9 import java.util.Date ;    
     10 import java.util.regex.Pattern ;    
     11 import java.util.regex.Matcher ;    
     12 import java.nio.MappedByteBuffer ;    
     13 import java.nio.channels.FileChannel ;    
     14    
     15    
     16 public class SS7Handle{    
     17     private String year ;    
     18     private String month ;    
     19     private String day ;    
     20     private long length ;    
     21     private File file ;    
     22     private int bufferSize = 0x600000;// 默認6M的緩沖 ;    
     23     private long diff ;    
     24         
     25         
     26     public SS7Handle(String path){    
     27         this.loadFile(path) ;    
     28     }    
     29         
     30     public List<String> getResult(int type,String number,String time,String minute,String second,int count){    
     31         List<String> result = new ArrayList<String>() ;    
     32         String strRex = getStrRex(type,number,time,minute,second) ;    
     33         Pattern pattern = Pattern.compile(strRex) ;    
     34         int counts = count ;    
     35         Date begin = null ;    
     36         Date end = null ;    
     37         try{    
     38             MappedByteBuffer inputBuffer = new RandomAccessFile(file,"r").getChannel()    
     39                                 .map(FileChannel.MapMode.READ_ONLY, 0, length);    
     40             byte[] dst = new byte[bufferSize] ; //每次讀出6M的內容     
     41             BufferedReader br = null ;    
     42             boolean findFirst  = false ;     
     43             boolean over = false ;    
     44             begin = new Date() ;            
     45             for(int offset=0; offset < length; offset+= bufferSize){    
     46                 //for(int offset=0; offset < 1; offset+= bufferSize){    
     47                         
     48                 if(length - offset >= bufferSize){    
     49                     for(int i = 0;i < bufferSize;i++)    
     50                               dst[i] = inputBuffer.get(offset + i);    
     51                 }else{    
     52                     for(int i = 0;i < length - offset;i++)    
     53                     dst[i] = inputBuffer.get(offset + i);    
     54                 }    
     55                 //把得到的dst 交給 BufferedReader 按行讀出    
     56                 br = new BufferedReader(new StringReader(new String(dst))) ;    
     57                 String line ;    
     58                 StringBuffer next = new StringBuffer() ;    
     59    
     60                 while((line=br.readLine()) != null ){    
     61                     if(!findFirst){        
     62                         if(pattern.matcher(line).find()){    
     63                                 System.out.println("line-->"+line) ;    
     64                                 counts-- ;    
     65                                 result.add(line) ;    
     66                                 findFirst = true ;    
     67                                 String[] temp = line.split("\|") ;    
     68                                 next.append(temp[4]).append("|").append(temp[5]) ;    
     69                         }    
     70                     }else if(findFirst) {    
     71                         if(line.contains(next.toString())){    
     72                             System.out.println(next) ;    
     73                             result.add(line) ;    
     74                             counts-- ;    
     75                         }    
     76                     }    
     77                     if(counts<0){    
     78                         over = true ;    
     79                         break ;    
     80                     }     
     81                 }                
     82                 br.close() ;    
     83                 if(over){    
     84                     break ;    
     85                 }           
     86             }    
     87             end = new Date();    
     88             this.setDiff(end.getTime()-begin.getTime()) ;    
     89         }catch(Exception e){    
     90             System.out.println("error") ;    
     91         }    
     92         return result ;    
     93     }     
     94         
     95         
     96     private String getStrRex(int type,String number,String hour,String minute,String second){    
     97         if(0<minute.length() && minute.length()<2){    
     98             minute = "0"+minute ;    
     99         }else if(0<second.length() && second.length()<2){    
    100             second = "0" +second ;    
    101         }    
    102         StringBuffer temp = new StringBuffer() ;    
    103         if(type == 1){  // 查詢 系統 打出的電話    
    104             String outnumber = "CD"+number ;    
    105             temp.append("^\[").append(day).append("\-").append(month).append("\-").append(year)    
    106                             .append(" ").append(hour)    
    107                             .append(!(minute.trim()==null || "".equals(minute.trim()))?("\:"+minute):"")    
    108                             .append(!(second.trim()==null || "".equals(second.trim()))?("\:"+second):"")    
    109                             .append(".*\<\-.*IAM.*").append(outnumber).append(".*") ;    
    110             System.out.println(temp.toString()) ;     
    111         }else if(type ==2){  //查詢 用戶打進的 電話    
    112             String innumber = "CG" + number ;    
    113             temp.append("^\[").append(day).append("\-").append(month).append("\-").append(year)    
    114                             .append(" ").append(hour)    
    115                             .append(!(minute.trim()==null || "".equals(minute.trim()))?("\:"+minute):"")    
    116                             .append(!(second.trim()==null || "".equals(second.trim()))?("\:"+second):"")    
    117                             .append(".*\-\>.*IAM.*").append(innumber).append(".*") ;     
    118         }    
    119         return temp.toString() ;    
    120     }    
    121         
    122     public void loadFile(String path){    
    123         this.file = new File(path) ;      
    124         this.setLength(file.length()) ;    
    125         int pathLength = path.length() ;    
    126         int start = pathLength - new String("xxxxxxxx_xxx.xxx").length() ;    
    127         this.setYear(path.substring(start,start+4)) ;    
    128         this.setMonth(path.substring(start+4,start+6)) ;    
    129         this.setDay(path.substring(start+6,start+8)) ;    
    130     }    
    131         
    132     public void setYear(String year){    
    133         this.year = year ;    
    134     }    
    135     public void setMonth(String month){    
    136         this.month = month ;    
    137     }    
    138     public void setDay(String day){    
    139         this.day = day ;    
    140     }    
    141     private void setLength(long length){    
    142         this.length = length ;    
    143     }    
    144     public void setDiff(long diff){    
    145         this.diff = diff ;    
    146     }    
    147     public long getDiff(){    
    148         return this.diff ;    
    149     }    
    150     public long getLength(){    
    151         return this.length ;    
    152     }    
    153     public String getYear(){    
    154         return this.year ;    
    155     }    
    156     public String getMonth(){    
    157         return this.month ;    
    158     }    
    159     public String getDay(){    
    160         return this.day ;    
    161     }    
    162     public String toString(){    
    163         return this.year+"-"+this.month+"-"+this.day ;    
    164     }    
    165    
    166 
    posted on 2008-11-02 14:51 小蟲旺福 閱讀(957) 評論(0)  編輯  收藏 所屬分類: javaEE
    主站蜘蛛池模板: 中文字幕手机在线免费看电影| 亚洲xxxx视频| av午夜福利一片免费看久久| 日本免费人成黄页网观看视频| 最新国产成人亚洲精品影院| 无限动漫网在线观看免费| 亚洲不卡中文字幕| 男人的好免费观看在线视频| 亚洲综合久久精品无码色欲| 日韩毛片免费无码无毒视频观看 | 福利免费在线观看| 在线亚洲精品自拍| a毛片在线看片免费| 成人午夜免费视频| 国产成人高清亚洲| 日韩精品在线免费观看| 91嫩草私人成人亚洲影院| 免费观看激色视频网站bd| 中国china体内裑精亚洲日本| 成年人免费观看视频网站| 国产成人精品久久亚洲高清不卡| 免费人成激情视频| 日本一区午夜艳熟免费| 久久亚洲私人国产精品| 午夜小视频免费观看| 一级做性色a爰片久久毛片免费| 亚洲国产成人高清在线观看| 日本人的色道免费网站| 亚洲AV女人18毛片水真多| 国产亚洲av人片在线观看| 最近2019免费中文字幕6| 亚洲中文字幕AV每天更新| 精品国产亚洲男女在线线电影 | 亚洲欧洲精品成人久久奇米网 | 中国在线观看免费高清完整版 | 青青免费在线视频| 久久久久亚洲精品美女| AV片在线观看免费| 在线观看免费黄网站| 亚洲avav天堂av在线网爱情| 亚洲国产中文v高清在线观看|