在 Groovy 中拖尾文件 [英] Tail a file in Groovy
问题描述
我想知道有没有一种简单的方法可以在 Groovy 中拖尾文件?我知道如何读取文件,但是如何读取文件然后等待添加更多行、读取它们、等待等...
I am wondering is there is a simple way to tail a file in Groovy? I know how to read a file, but how do I read a file and then wait for more lines to be added, read them, wait, etc...
我确信这是一个非常愚蠢的解决方案:
I have what I am sure is a really stupid solution:
def lNum = 0
def num= 0
def numLines = 0
def myFile = new File("foo.txt")
def origNumLines = myFile.eachLine { num++ }
def precIndex = origNumLines
while (true) {
num = 0
lNum = 0
numLines = myFile.eachLine { num++ }
if (numLines > origNumLines) {
myFile.eachLine({ line ->
if (lNum > precIndex) {
println line
}
lNum++
})
}
precIndex = numLines
Thread.sleep(5000)
}
请注意,我对调用 Unix "tail" 命令并不真正感兴趣.除非它是唯一的解决方案.
Note that I am not really interested in invoking the Unix "tail" command. Unless it is the only solution.
推荐答案
我写了一个类似于基本尾部功能的 groovy 类:
I wrote a groovy class which resembles the basic tail functionality:
class TailReader {
boolean stop = false
public void stop () {
stop = true
}
public void tail (File file, Closure c) {
def runnable = {
def reader
try {
reader = file.newReader()
reader.skip(file.length())
def line
while (!stop) {
line = reader.readLine()
if (line) {
c.call(line)
}
else {
Thread.currentThread().sleep(1000)
}
}
}
finally {
reader?.close()
}
} as Runnable
def t = new Thread(runnable)
t.start()
}
}
tail
方法将文件和闭包作为参数.它将在一个单独的线程中运行,并将将附加到文件的每个新行传递给给定的闭包.tail
方法将一直运行,直到在 TailReader
实例上调用 stop
方法.下面是一个关于如何使用 TailReader
类的简短示例:
The tail
method taks a file and closure as parameters. It will run in a separate thread and will pass each new line that will be appended to the file to the given closure. The tail
method will run until the stop
method is called on the TailReader
instance. Here's a short example of how to use the TailReader
class:
def reader = new TailReader()
reader.tail(new File("/tmp/foo.log")) { println it }
// Do something else, e.g.
// Thread.currentThread().sleep(30 * 1000)
reader.stop()
这篇关于在 Groovy 中拖尾文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!