如何定时去读取一个动态(一直在往里面写)的log文件? log文件在持续增加,不断有日志添加进去,怎么样用一个什么方法可以把新增加的log文件全部读取了?我的想法是:每次读取完一段日志以后,在读完的最后一行加一个标记,下次再读的时候从该标记的地方再读,这个方法该如何实现?或者有没有更好的办法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 大致一个思路: 保存每次读取完后流的位置,比如:position; 下次直接将流移动到这个位置(position),然后再开始读。但具体的api函数没用过,大致应该是用这个类:RandomAccessFile, 以及position = getFilePointer()方法和seek(position)方法; 在读log文件的时候,这个文件是只读的,文件中的position可能会有很多个,这样的情况怎么解决? 可以用日期作为标记呀,log日志应该要有日期信息的,你在读的时候从文件最后一行开始向上的,当然这样需要操作文件游标,一直找到你上次的记录过的结束位置为止,然后把最后一行的日志的日期作为book保存的你的程序或者数据库或者文件(不是你读取的这个log)中,以后每次都这样从后后向上找,然后更新book的值。 第一次读,记下文件长度。以后读,就从第一次的尾部读取。用RandomAccessFile. 给你写了个例子代码:import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.RandomAccessFile;import java.io.ByteArrayInputStream;class Reader implements Runnable { Reader(String filename) { this.filename = filename; } private String filename; private long filelength = 0; private int count=0; @Override public void run() { while (true) { try { File f = new File(filename); long nowlength = f.length(); long readlength = nowlength - filelength; if (readlength == 0) { Thread.sleep(1000); continue; } RandomAccessFile rf = new RandomAccessFile(f, "r"); // 移动文件指针到上次读的最后 rf.seek(filelength); filelength=nowlength; byte[] b = new byte[(int) readlength]; rf.read(b, 0, b.length); rf.close(); BufferedReader br=new BufferedReader(new InputStreamReader(new ByteArrayInputStream(b))); String str=null; count++; System.out.println("第"+count+"次读到的内容:"); while((str=br.readLine())!=null){ System.out.println(str); } br.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}class Writer implements Runnable{ Writer(String filename) { this.filename = filename; } private String filename; private int count=0; @Override public void run() { while (count++<100){ try { PrintWriter pw=new PrintWriter(new FileWriter(filename,true)); pw.append(""+count).append("\t").append(""+System.currentTimeMillis()).append("写入的内容").append("\r\n"); pw.close(); Thread.sleep(100); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }public class ReadFileFromTrail { public static void main(String[] args) { Reader reader=new Reader("d:\\test.log"); Writer writer=new Writer("d:\\test.log"); new Thread(reader).start(); new Thread(writer).start(); }} log4j 就有这个功能啊 org.apache.log4j.RollingFileAppender 可以设置文件的大小和数量 sorry 看错了, 可以使用字节流保存 文件读取的时候可以定位到字节数。 如何用java程序输出一个字符串到一张图片的右下角 indexOf()的用法有点不懂,求讲解。 有人了解openxml吗?????能给个下包的地址吗? 给详细介绍一下用法啊!!!!!!!!!!! 大家帮我看看报哪里出问题了?万分感谢 if...else if...高级问题 非常简单的问题,看你会不会? 在JBuilder里面为什么用控件数组总是不成功? scjp一题!!! 请问安装了Jb5以后总是要我注册怎么办? socket传文件,如何设置合理的缓存? 求教!!!! 请问,在类A中 add 一个类B的对象, 类B是接口的实现,如何在类B中读取 类A中的属性?
保存每次读取完后流的位置,比如:position;
下次直接将流移动到这个位置(position),然后再开始读。
但具体的api函数没用过,大致应该是用这个类:RandomAccessFile,
以及position = getFilePointer()方法和seek(position)方法;
以后读,就从第一次的尾部读取。用RandomAccessFile.
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.ByteArrayInputStream;class Reader implements Runnable {
Reader(String filename) {
this.filename = filename;
} private String filename;
private long filelength = 0;
private int count=0;
@Override
public void run() {
while (true) {
try {
File f = new File(filename);
long nowlength = f.length();
long readlength = nowlength - filelength;
if (readlength == 0) {
Thread.sleep(1000);
continue;
}
RandomAccessFile rf = new RandomAccessFile(f, "r");
// 移动文件指针到上次读的最后
rf.seek(filelength); filelength=nowlength;
byte[] b = new byte[(int) readlength];
rf.read(b, 0, b.length);
rf.close();
BufferedReader br=new BufferedReader(new InputStreamReader(new ByteArrayInputStream(b)));
String str=null;
count++;
System.out.println("第"+count+"次读到的内容:");
while((str=br.readLine())!=null){
System.out.println(str);
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}class Writer implements Runnable{
Writer(String filename) {
this.filename = filename;
}
private String filename;
private int count=0;
@Override
public void run() {
while (count++<100){
try {
PrintWriter pw=new PrintWriter(new FileWriter(filename,true));
pw.append(""+count).append("\t").append(""+System.currentTimeMillis()).append("写入的内容").append("\r\n");
pw.close();
Thread.sleep(100);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}public class ReadFileFromTrail {
public static void main(String[] args) {
Reader reader=new Reader("d:\\test.log");
Writer writer=new Writer("d:\\test.log");
new Thread(reader).start();
new Thread(writer).start();
}}
org.apache.log4j.RollingFileAppender
可以设置文件的大小和数量