当前位置:  开发笔记 > 编程语言 > 正文

unix/linux的Java IO实现"tail -f"

如何解决《unix/linux的JavaIO实现"tail-f"》经验,为你挑选了4个好方法。

我想知道用什么技术和/或库来实现linux命令"tail -f"的功能.我基本上是在寻找一个附加/替换的下降java.io.FileReader.客户端代码可能如下所示:

TailFileReader lft = new TailFileReader("application.log");
BufferedReader br = new BufferedReader(lft);
String line;
try {
  while (true) {
    line= br.readLine();
    // do something interesting with line
  }
} catch (IOException e) {
  // barf
}

缺失的部分是合理的实施TailFileReader.它应该能够读取文件打开前存在的文件部分以及添加的行.



1> Chetan Sastr..:

看看Apache Commons实现的Tailer类.它似乎也处理日志轮换.



2> matt b..:

能够继续读取文件,并等待文件为您提供更多更新,这本身并不难以在代码中完成.这是一些伪代码:

BufferedReader br = new BufferedReader(...);
String line;
while (keepReading) {
    line = reader.readLine();
    if (line == null) {
        //wait until there is more of the file for us to read
        Thread.sleep(1000);
    }
    else {
        //do something interesting with the line
    }
}

我假设您希望将此类功能放在其自己的Thread中,以便您可以将其休眠并且不会影响应用程序的任何其他区域.您可能希望keepReading在setter中公开,以便您的主类/应用程序的其他部分可以安全地关闭线程而不会有任何其他麻烦,只需通过调用stopReading()或类似的东西.


这不考虑文件截断; 如果日志文件被覆盖,则此代码将失败...这是尾部的基本功能!
注意:如果要尾,请使用br.skip(file.length()); 我尝试使用RandomAccessReader(),但这非常*非常慢.

3> aldrinleal..:

检查JLogTailer,它执行此逻辑.

代码中的要点是:

public void run() {
    try {
        while (_running) {
            Thread.sleep(_updateInterval);
            long len = _file.length();
            if (len < _filePointer) {
                // Log must have been jibbled or deleted.
                this.appendMessage("Log file was reset. Restarting logging from start of file.");
                _filePointer = len;
            }
            else if (len > _filePointer) {
                // File must have had something added to it!
                RandomAccessFile raf = new RandomAccessFile(_file, "r");
                raf.seek(_filePointer);
                String line = null;
                while ((line = raf.readLine()) != null) {
                    this.appendLine(line);
                }
                _filePointer = raf.getFilePointer();
                raf.close();
            }
        }
    }
    catch (Exception e) {
        this.appendMessage("Fatal error reading log file, log tailing has stopped.");
    }
    // dispose();
}



4> Alexander Az..:

我前段时间在Scala中构建了一个简短的"tail -f"实现:tailf.它还负责文件轮换,您可以定义自己的逻辑,当它到达EOF时发生了什么,或者发现文件已被重命名.

您可以查看并将其移植到Java,因为实际上没有任何复杂的东西.几个注意事项:主文件是Tail.scala,基本上它定义了FollowingInputStream哪个处理EOF/rename和follow方法,它包含FollowingInputStream在一个无限的枚举中SequenceInputStream.因此,一旦FollowingInputStream结束,就会创建SequenceInputStream请求来自Enumeration另一个元素的下一个元素FollowingInputStream.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有