在Groovy中跟踪文件
我想知道是否有一种简单的方法可以在Groovy中跟踪文件?我知道如何读取文件,但如何读取文件,然后等待添加更多行,读取它们,等等 我有一个非常愚蠢的解决方案:在Groovy中跟踪文件,groovy,Groovy,我想知道是否有一种简单的方法可以在Groovy中跟踪文件?我知道如何读取文件,但如何读取文件,然后等待添加更多行,读取它们,等等 我有一个非常愚蠢的解决方案: 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 =
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”命令并不感兴趣。除非它是唯一的解决方案。我编写了一个类似于基本尾部功能的groovy类:
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
类的一个简短示例:
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()
回复克里斯托夫:
对于我的用例,我已经替换了块
line = reader.readLine()
if (line) {
c.call(line)
}
else {
Thread.currentThread().sleep(1000)
}
与while ((line = reader.readLine()) != null)
c.call(line)
Thread.currentThread().sleep(1000)`
…=null
=>以确保同时输出空行while(…
=>确保每一行的读取速度都尽可能快谁不喜欢Groovy?