java快速读取日志文件最后一行数据,日志文件非常大。

java快速读取日志文件最后一行数据,日志文件非常大。由于日志文件在服务器上是不断变化的,所以肯定是不能把文件下载到本地再读取。要用RandomAccessFile来实现... java快速读取日志文件最后一行数据,日志文件非常大。由于日志文件在服务器上是不断变化的,所以肯定是不能把文件下载到本地再读取。要用RandomAccessFile来实现。我的思路是用RandomAccessFile中的seek(long pos) 跳到最后一个字节,然后一个字节一个字节往回查,查到换行符为止,并显示出来。可是不知道如何来实现。请高手举例指点一下,谢谢!在线等! 展开
 我来答
简单说架构
2015-08-13 · TA获得超过257个赞
知道小有建树答主
回答量:137
采纳率:50%
帮助的人:64.1万
展开全部
package cn.com.songjy.test.io;  
  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.io.RandomAccessFile;  
  
/** 
 * 从最后一行开始读取 
 */  
public class FromEndRF {  
  
    /** 
     *  
     * @param filename 目标文件 
     * @param charset 目标文件的编码格式 
     */  
    public static void read(String filename, String charset) {  
  
        RandomAccessFile rf = null;  
        try {  
            rf = new RandomAccessFile(filename, "r");  
            long len = rf.length();  
            long start = rf.getFilePointer();  
            long nextend = start + len - 1;  
            String line;  
            rf.seek(nextend);  
            int c = -1;  
            while (nextend > start) {  
                c = rf.read();  
                if (c == '\n' || c == '\r') {  
                    line = rf.readLine();  
                    if (line != null) {  
                        System.out.println(new String(line  
                                .getBytes("ISO-8859-1"), charset));  
                    } else {  
                        System.out.println(line);  
                    }  
                    nextend--;  
                }  
                nextend--;  
                rf.seek(nextend);  
                if (nextend == 0) {// 当文件指针退至文件开始处,输出第一行  
                    // System.out.println(rf.readLine());  
                    System.out.println(new String(rf.readLine().getBytes(  
                            "ISO-8859-1"), charset));  
                }  
            }  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                if (rf != null)  
                    rf.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
  
    public static void main(String args[]) {  
        read("mynewfile.txt", "UTF-8");  
    }  
}

说明:以上是一个倒着读取文件的案例,可以根据此案例,结合自己的实际需求来设计自己的代码。另外,如果是web应用或其它持续型应用,可以尝试利用单独线程保持文件打开或将读取位置存储在内存中。

匿名用户
2013-06-25
展开全部
package zipfile;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class FromEndRF {
public static void main(String args[]){
RandomAccessFile rf=null;
try {
rf=new RandomAccessFile("H:/JSP/tech/login.jsp","r");
long len=rf.length();
long start=rf.getFilePointer();
long nextend=start+len-1;
String line;
rf.seek(nextend);
int c=-1;
while(nextend>start){
c=rf.read();
if(c=='\n'||c=='\r'){
line=rf.readLine();
if(line==null){//处理文件末尾是空行这种情况
nextend--;
rf.seek(nextend);
continue;}
System.out.println(line);
nextend--;
}
nextend--;
rf.seek(nextend);
if(nextend==0){//当文件指针退至文件开始处,输出第一行
System.out.println(rf.readLine());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
rf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这是读取文件的最后一行,然后倒着往上一行一行输出,应该看的懂吧?
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式