我正在尝试读取流式传输的日志文件。此文件正在追加新记录。
while(true){
for (line <- Source.fromFile(filename).getLines()) {
pub.publish(topic, line)}}
使用上面的代码,它从头开始再次读取文件。我怎么能克服这种情况。接下来我希望它从即将到来的记录中读取而不是整个记录
答案 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)
}
}
}