我有一个文件/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!) - 我不想吸引那么多新东西,我不需要做这么简单/基本的事情。我真的没有其他(小!)库或技术吗?
答案 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
. . .