Scala:将文件读取为无限/异步流线

时间:2016-03-25 23:18:06

标签: scala file asynchronous io stream

我有一个文件/files/somelog.log,由其他进程连续写入。我想要做的是将该文件作为(永无止境的)流读取,并在有新的日志行可用时对其进行响应。

val logStream: Stream[String] = readAsStream("/files/somelog.log")
logStream.foreach { line: String => println(line) }

因此,当另一个进程将anther行写入日志文件时,我希望上面的println关闭(并且保持关闭)。

然而,这似乎不是默认的Stream-type的工作方式。 Scala的Stream并不是异步,它只是懒惰。我可能正在寻找的东西类似于akka溪流提供的东西(我认为)。但Akka是如此巨大(150MB!) - 我不想吸引那么多新东西,我不需要做这么简单/基本的事情。我真的没有其他(小!)库或技术吗?

2 个答案:

答案 0 :(得分:2)

如果您只想拖尾文件,可以使用Apache Commons IO中的Tailer

val l = new TailerListenerAdapter() {
    override def handle(line: String): Unit = println(line)
}

val tail = Tailer.create(new File("file.txt"), l)

答案 1 :(得分:0)

我实际上并没有推荐这个,但你可以自己动手。

def nextLine( itr: Iterator[String] ): String = {
  while (!itr.hasNext) Thread.sleep(2000)
  itr.next
}
. . .
val log = io.Source.fromFile("/files/somelog.log").getLines
val logTxt = nextLine( log )  // will block until next line is available
. . .