在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 = 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()

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...