我怎样才能读取更新文件?

时间:2016-08-26 05:32:33

标签: java scala

我正在尝试读取流式传输的日志文件。此文件正在追加新记录。

while(true){
for (line <- Source.fromFile(filename).getLines()) {
    pub.publish(topic, line)}}

使用上面的代码,它从头开始再次读取文件。我怎么能克服这种情况。接下来我希望它从即将到来的记录中读取而不是整个记录

2 个答案:

答案 0 :(得分:0)

此问题已在此处得到解答:Java IO implementation of unix/linux "tail -f"

我对scala不熟悉,但似乎逻辑简单明了,可以转换成scala语法。希望这可以提供帮助。

答案 1 :(得分:0)

BufferedReader救援

我使用java.io.BufferedReader解决了这个问题。

简短解决方案

while (true) {

   if (reader.readLine() != null) {
    //keep reading and pushing the data to function f
    f(reader.readLine())
   } else {
    Try {
     Thread.sleep(checkingTime)
    }
   }//end of if

  }//end of while

更多信息

让我们说stream.txt是另一个进程不断更新的文件。

现在,如果我们想从文件中逐步读取而不从头开始。

诀窍是BufferReader readLine方法到达null时返回EOF,等到null时等待并开始检查是否使用readLine将任何内容写入文件,并使用相同的readLine开始阅读。

以下是渐进式阅读的代码段。

object ProgressiveReader {

 def read(file: File, checkingTime: Long = 1000)(f: String => Unit): Unit = {

  import java.io._

  val reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)))

  while (true) {

   if (reader.readLine() != null) {
    //keep reading and pushing the data to function f
    f(reader.readLine())
   } else {
    Try {
     Thread.sleep(checkingTime)
    }
   }//end of if

  }//end of while

}

 //usage
 def main(args: Array[String]): Unit = {
  read(new File("stream.txt")) { str =>
   println(str)
  }
 }

}