我想知道是否有一种简单的方法可以在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 = 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()