在Clojure中传递一个文件?

vik*_*sit 9 file-io clojure

在Clojure中拖尾文件的最佳方法是什么?我没有遇到任何有助于这样做的实用程序,但是如何构建一个实用程序的想法将不胜感激!

谢谢.

Jür*_*zel 13

正如kotarak所说,你可以使用RandomAccessFile来寻找文件的末尾.不幸的是,你必须忙着等待/睡觉才能做出改变.

使用延迟序列,您可以"在运行中"处理这些行:

(import java.io.RandomAccessFile)

(defn raf-seq
  [#^RandomAccessFile raf]
  (if-let [line (.readLine raf)]
    (lazy-seq (cons line (raf-seq raf)))
    (do (Thread/sleep 1000)
        (recur raf))))

(defn tail-seq [input]
  (let [raf (RandomAccessFile. input "r")]
    (.seek raf (.length raf))
    (raf-seq raf)))

; Read the next 10 lines
(take 10 (tail-seq "/var/log/mail.log"))
Run Code Online (Sandbox Code Playgroud)

更新:

类似于tail -f /var/log/mail.log -n 0,使用doseq,因此实际上消耗了更改.

(doseq [line (tail-seq "/var/log/mail.log")] (println line))
Run Code Online (Sandbox Code Playgroud)