Java文件跟踪程序实现
实现一个java文件监视程序,它相当于Java文件跟踪程序实现,java,file,io,Java,File,Io,实现一个java文件监视程序,它相当于tail-f somefile 我读过一些类似的问题。我看到了一些选择 使用BufferedReader,基本思想是使用缓冲读取器读取文件。如果返回null,则休眠几秒钟,然后在无限循环中继续。我在这方面做了一些实验,结果显示,只要你读到文件的末尾,那么getLine方法就不会再给你任何更新。那么,这种方法有效吗 使用随机访问文件。每次进行读取操作时,创建一个随机访问文件,并将文件长度与历史文件长度进行比较,如果当前文件更长,则查找最后一次读取并读取增量部分
tail-f somefile
我读过一些类似的问题。我看到了一些选择
BufferedReader
,基本思想是使用缓冲读取器读取文件。如果返回null,则休眠几秒钟,然后在无限循环中继续。我在这方面做了一些实验,结果显示,只要你读到文件的末尾,那么getLine
方法就不会再给你任何更新。那么,这种方法有效吗随机访问文件
。每次进行读取操作时,创建一个随机访问文件,并将文件长度与历史文件长度进行比较,如果当前文件更长,则查找最后一次读取并读取增量部分。我确信这是可行的,但是每次读取时都会打开一个新的随机访问文件,难道没有更有效的方法吗stream
API,我想这与尾部附加的新内容无关。这只是第一次给出的结果。我的问题是,是否可以扩展此流api以考虑tailer函数
- 能否使用
实现BufferedReader
?在我的例子中,一旦读取pass EOF,只返回nulltail-f
- JDK8
能否用于实现stream
tail-f
- 除了像apachecommonlib那样反复打开关闭文件之外,还有更有效的实现吗
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
Buf有问题feredReader
code。BufferedReader
在读取之间不保留EOF状态。readLine()
可以读取超出返回NULL的点的数据(如果随后添加了数据)。对此进行了多次测试。