现在手头上的项目,需要对log文件进行解析,然后将结果显示给用户。
由于log文件最大可以到25000行,即10M左右,故一次性读入内存并解析的可用性很差(我自己做过试验,发现Tomcat在默认内存配置下读不完就出OutOfMemory错;在修改xms和xmx后,可以正常运行,可是速度奇慢,而且也不可能将25000行log显示在一页中)。
所以决定采取分块读入,逐块解析的办法(即先读入一部分,当用户需要后面的部分时,再进行读入和解析)。
我之前没有碰到过类似的处理情况(只做过页面分页),对具体的实现方式不是特别清楚,还望有过类似经验的牛人们多多指点
小弟在这里先谢过了

解决方案 »

  1.   

    用RandomAccessFile不就行了,从特定的行读起,每次读多少行
      

  2.   

    static long filePointer = 0;
    static long readLog(String strPath , int lineNum){
    RandomAccessFile myFile = null;
    try{
    myFile = new RandomAccessFile(strPath, "r");
    myFile.seek(filePointer);
    for (int i = 0 ;i< lineNum ; ++i){
    String str = myFile.readLine();
    System.out.println(str);
    }
    filePointer = myFile.getFilePointer();
    } catch(Exception e){
    }
    return filePointer;
    } public static void main(String[] args) throws Exception{
    filePointer = readLog("c:\\cc.txt",2);//第一次读2行
    System.out.println("_________________________");
    filePointer = readLog("c:\\cc.txt",4);//接着上次,读4行
             }
      

  3.   

    上面两位的做法和我现在的实现方式一样,可是由于RandomAccessFile不能将行号作为偏移量直接读取,所以如果我要是想要第5行和第七行(举个例子)的话,必须要先算出它们对应的偏移量,才可以实现,这样一来效率肯定会有很大影响,不知道还有没有更好的办法????
    无论如何,十分感谢两位的帮助,一人20分,以表谢意。:)
      

  4.   

    建议你log文件大到一定程度就新建文件
      

  5.   

    log文件是由其他程序生成的,我们这边只有解析的义务,却没有限制log大小的权利
    如果可以缩小log大小的话,谁也不会愿意用内存分页这种费时费力的方法啊
      

  6.   

    那你就把tomcat的内存加大,
    catalina.bat中加入
    JAVA_OPTS='-Xms256m -Xmx512m'或者是把日志读出来放到数据库里存储。在或者是你读这个大文件,然后自己生成几个临时小文件,然后再读小文件就是了。