【问题标题】:Continually read the lines being appended to a log file持续读取附加到日志文件的行
【发布时间】:2010-02-10 16:16:38
【问题描述】:

关于我之前的 question ,我发现 maven 并不能真正输出 jboss 控制台。所以我想我想解决它。这是交易:

当 jboss 运行时,它会将控制台日志写入 server.log 文件,所以我试图检索数据,因为每隔几秒钟文件就会被 jboss 更改/更新,我遇到了一些困难所以我需要帮助。

我真正需要的是:

  1. 读取文件 server.log
  2. 当更改 server.log 并添加几行时输出更改

这是我目前得到的代码,它有问题,它会无限期地运行,并且每次都从文件的开头开始,我希望它继续打印 server.log 中的新行.希望这里的代码有意义:

import java.io.*;


class FileRead 
{
   public static void main(String args[])
  {
      try{
   for(;;){ //run indefinitely
    // Open the file 
    FileInputStream fstream = new FileInputStream("C:\\jboss-5.1.0.GA\\server\\default\\log\\server.log");
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
    String strLine;
    //Read File Line By Line
    while ((strLine = br.readLine()) != null)   {
      // Print the content on the console
      System.out.println (strLine);
    }
    //Close the input stream
    in.close();
    }
  }
      catch (Exception e){//Catch exception if any
      System.err.println("Error: " + e.getMessage());
    }
  }
}

根据 Montecristo 的建议,我这样做了:

import java.io.*;

class FileRead {
    public static void main(String args[]) {
        try {
            // Open the file that is the first
            // command line parameter
            FileInputStream fstream = new FileInputStream(
                    "C:\\jboss-5.1.0.GA\\server\\default\\log\\server.log");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            String line;
            // Read File Line By Line
            while ((line = br.readLine()) != null) {
                // Print the content on the console
                line = br.readLine();
                if (line == null) {
                    Thread.sleep(1000);
                } else {
                    System.out.println(line);
                }

            }
            // Close the input stream
            in.close();

        } catch (Exception e) {// Catch exception if any
            System.err.println("Error: " + e.getMessage());
        }
    }
}

它仍然无法正常工作,它只是打印了原始文件..虽然文件不断变化,但没有任何反应..除了原始日志文件之外什么都没有打印出来。

解决方案在这里: tnx Montecristo

import java.io.*;

class FileRead {
    public static void main(String args[]) {
        try {

            FileInputStream fstream = new FileInputStream(
                    "C:\\jboss-5.1.0.GA\\server\\default\\log\\server.log");

            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            String line;

            while (true) {

                line = br.readLine();
                if (line == null) {
                    Thread.sleep(500);
                } else {
                    System.out.println(line);
                }

            }

        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

另见:

http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html

【问题讨论】:

  • @skaffman 不是重复的 .. 我仍然没有得到我的答案 .. 我需要它不断运行
  • 我和 skaffman 链接的帖子中接受的答案确实持续运行......
  • @Montecristo 那么它没有重复的问题不是吗?因为 server.log 每隔几秒钟就会更改一次.. 我想将那些更改的行从 server.long 添加到我已经输出的控制台输出中(在输出的末尾)
  • 您确定while ((line = br.readLine()) != null)while (keepReading) 相同,然后根据BufferedReader 阅读的内容而进行阅读/睡眠吗?我现在不能自己尝试,但我不认为它是......

标签: java


【解决方案1】:

我不知道你的方向是否正确,但如果我理解正确,你会发现这很有用:java-io-implementation-of-unix-linux-tail-f

【讨论】:

    【解决方案2】:

    您可以使用 RandomAccessFile。

    import java.io.IOException;
    import java.io.RandomAccessFile;
    
    public class LogFileReader {
    
        public static void main( String[] args ) {
           String fileName = "abc.txt";
           try {
            RandomAccessFile bufferedReader = new RandomAccessFile( fileName, "r" 
            );
    
            long filePointer;
            while ( true ) {
                final String string = bufferedReader.readLine();
    
                if ( string != null )
                    System.out.println( string );
                else {
                    filePointer = bufferedReader.getFilePointer();
                    bufferedReader.close();
                    Thread.sleep( 2500 );
                    bufferedReader = new RandomAccessFile( fileName, "r" );
                    bufferedReader.seek( filePointer );
                }
    
            }
        } catch ( IOException | InterruptedException e ) {
            e.printStackTrace();
        }
    
    }
    }    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 2018-11-09
      • 1970-01-01
      • 2020-03-30
      • 2011-07-10
      相关资源
      最近更新 更多