Java文件跟踪程序实现

Java文件跟踪程序实现,java,file,io,Java,File,Io,实现一个java文件监视程序,它相当于tail-f somefile 我读过一些类似的问题。我看到了一些选择 使用BufferedReader,基本思想是使用缓冲读取器读取文件。如果返回null,则休眠几秒钟,然后在无限循环中继续。我在这方面做了一些实验,结果显示,只要你读到文件的末尾,那么getLine方法就不会再给你任何更新。那么,这种方法有效吗 使用随机访问文件。每次进行读取操作时,创建一个随机访问文件,并将文件长度与历史文件长度进行比较,如果当前文件更长,则查找最后一次读取并读取增量部分

实现一个java文件监视程序,它相当于
tail-f somefile

我读过一些类似的问题。我看到了一些选择

  • 使用
    BufferedReader
    ,基本思想是使用缓冲读取器读取文件。如果返回null,则休眠几秒钟,然后在无限循环中继续。我在这方面做了一些实验,结果显示,只要你读到文件的末尾,那么
    getLine
    方法就不会再给你任何更新。那么,这种方法有效吗

  • 使用
    随机访问文件
    。每次进行读取操作时,创建一个随机访问文件,并将文件长度与历史文件长度进行比较,如果当前文件更长,则查找最后一次读取并读取增量部分。我确信这是可行的,但是每次读取时都会打开一个新的随机访问文件,难道没有更有效的方法吗

  • 我看到新的JDK在缓冲文件读取器中添加了
    stream
    API,我想这与尾部附加的新内容无关。这只是第一次给出的结果。我的问题是,是否可以扩展此流api以考虑
    tailer函数

  • 问题:

    • 能否使用
      BufferedReader
      实现
      tail-f
      ?在我的例子中,一旦读取pass EOF,只返回null

    • JDK8
      stream
      能否用于实现
      tail-f

    • 除了像apachecommonlib那样反复打开关闭文件之外,还有更有效的实现吗


    我前一段时间做过这件事,根据我的经验,我想你的问题可能没有实际意义——最好在读取之间关闭文件,或者像我的类似问题中建议的那样使用Apache Tailer类:

    这不仅有助于刷新,还可以防止在读取文件时锁定文件

    我最终没有使用它(因为在我的环境中获得软件批准是一项挑战)——相反,我选择使用这样的过程:

    Detect Change
    Open file
    Seek to previous position
    Read to end of file
    Remember position for next seek
    Close 
    
    这个预制棒非常好,解决了很多问题——我已经用了一段时间了

    该链接问题中有人建议使用java.nio.file.WatchService.poll()来检测有效的更改,但重复读取文件大小也是如此

    您在#2中提到了这个open/seek/close方法——不要担心性能,因为与等待文件更新相比,open/tail/close部分的时间将非常短。如果希望提高效率,请在文件大小测试之间添加更长的延迟。这样一来,它一次会挤出更多的行,但读取文件的频率会降低


    回顾我的代码,我最终使用了一个FileChannel(FileInputStream.getChannel()),它有一个位置设置方法。

    我最终使用了一些Apache库来解决这个问题。(我一记住就会更新)

    本质上,文件监视程序依赖于文件系统API。在linux发行版上,阅读EOF可能会很好,并在以后添加新内容

    我观察到的问题是在MACOs上,一旦在EOF之后读取,该文件处理程序就不再有效。如果知道正在阅读新内容,则必须重新打开该文件

    • 这是在MacOs Maveriks上,我没有测试它在最新版本上仍然是一样的
    • 这也是基于JDK api,而不是底层的MACOS文件系统api。因为我觉得
      less/F
      tail-F
      应该更有效地实现
    1和3可能是最简单的,实际上这只是您的选择。如果您已经看到了所有这些的实现,为什么要问?挑一个最吸引你的。就我个人而言,我是用groovy做的。我用def text=new file(“tailFile.txt”).text.split()或类似的东西读取整个文件——您可以从“text”中选择任何需要的行。非常简单,如果内存不足,我会重新编写(到目前为止,我没有,因为我没有跟踪任何10gb文件.ps。你的问题是用命令的形式表达的。你是要求我们选择一个选项还是给你一个完整的实现?@BillK,正如我在选项1/3中所说的,它能工作吗?在我的情况下,在它读到最后之后,根本没有返回任何新内容。你的
    Buf有问题feredReader
    code。
    BufferedReader
    在读取之间不保留EOF状态。
    readLine()
    可以读取超出返回NULL的点的数据(如果随后添加了数据)。对此进行了多次测试。