在 Groovy 中拖尾文件 [英] Tail a file in Groovy

查看:25
本文介绍了在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆