如何使用Java ON LINUX实时读取文本文件?

我对Java相对来说比较陌生,所以如果我的术语不符合要求,请与我联系。 我把“ON LINUX”放在大写字母中,不会让你恼火,但是因为我已经可以在Windows上使用3个不同的文件读取类来完成这个任务了。 FileIntputStream BufferedReader RandomAccessFile(最后两个我相信,但第一个可能是错的 – 我的记忆是baaad。)所有这些都在我的窗户上完美的工作。 我对这些阅读器的使用意图是逐行阅读一个文本文件,也就是说,当这个文件的新版本保存着一个新的行时,java程序读取这行代码,然后继续检查另一条新线路。

我尝试使用Java 7 openJDK,Java 7 Oracle和Java 8 Oracle环境进行编译,所有生成的.jars在windows上运行良好,而且由于Java是跨平台的,我认为它们也可以在Linux上工作(对吧?在linux上testing时,我编译的版本失败了。 这引起了我的注意,运行Linux Red Hat的社区论坛成员,没有错误/exception,看起来像是在运行,但没有工作。 我今天安装了Ubuntu,自己尝试了一下:读者将读取原始文件,但不会实时“stream”文件。 对文件的更改不被注意。 我很困惑,这是怎么可能的,老实说,我很惊讶它没有被带到任何地方(据我可以告诉大声笑)。 希望这意味着我在某个地方犯了一个愚蠢的错误,以确保有人可能跟踪的Linux兼容性。 任何和所有帮助/答案/变通办法表示赞赏!

这里是我想要在我的程序中实现的代码示例:

import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; public class Driver { public static void main(String[] args) { RandomAccessFile reader = null; try { reader = new RandomAccessFile(new File("/home/citats/csgo/console.log"), "r"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } String currLine; Boolean done = false; while (!done) { try { if ((currLine = reader.readLine()) != null) { System.out.println(currLine); if (currLine.equals("done")) done = true; } else try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } reader.close(); } } 

拖尾文件

为了获得像tail -f这样的功能,你的解决方案正在监视新的文件更新,然后对它们做一些事情,看看这个答案: 我怎样才能跟随像Java中的“Tail -f”这样的文件,而不需要打开文件(防止重命名/删除) 。 这个来源是你正在尝试的内容。 我怀疑一些寻求解决你所看到的问题。 拖车来源

JavaRX文件是一种替代的,非常有趣的方式,可以实现类似的结果,但功能更强大,您可以使用Java NIO以更加不同步的方式安排新的更改。 在他们的主页上有一个例子: RxJava文件github页面

 import com.github.davidmoten.rx.FileObservable; import rx.Observable; import java.io.File; Observable<String> items = FileObservable.tailer() .file("/var/log/server.log") .startPosition(0) .sampleTimeMs(500) .chunkSize(8192) .utf8() .tailText(); 

RxJava

有关为什么使用JavaRx请参阅RxJava项目的更多信息