log文件在持续增加,不断有日志添加进去,怎么样用一个什么方法可以把新增加的log文件全部读取了?
我的想法是:每次读取完一段日志以后,在读完的最后一行加一个标记,下次再读的时候从该标记的地方再读,这个方法该如何实现?
或者有没有更好的办法?

解决方案 »

  1.   

    大致一个思路:
       保存每次读取完后流的位置,比如:position;
       下次直接将流移动到这个位置(position),然后再开始读。
    但具体的api函数没用过,大致应该是用这个类:RandomAccessFile
        以及position = getFilePointer()方法和seek(position)方法;
        
      

  2.   

    在读log文件的时候,这个文件是只读的,文件中的position可能会有很多个,这样的情况怎么解决?
      

  3.   

    可以用日期作为标记呀,log日志应该要有日期信息的,你在读的时候从文件最后一行开始向上的,当然这样需要操作文件游标,一直找到你上次的记录过的结束位置为止,然后把最后一行的日志的日期作为book保存的你的程序或者数据库或者文件(不是你读取的这个log)中,以后每次都这样从后后向上找,然后更新book的值。
      

  4.   

    第一次读,记下文件长度。
    以后读,就从第一次的尾部读取。用RandomAccessFile.
      

  5.   

    给你写了个例子代码: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();
    }}
      

  6.   

    log4j 就有这个功能啊  
    org.apache.log4j.RollingFileAppender  
    可以设置文件的大小和数量
      

  7.   

    sorry 看错了, 可以使用字节流保存  文件读取的时候可以定位到字节数。