在Clojure中拖尾文件的最佳方法是什么?我没有遇到任何有助于这样做的实用程序,但是如何构建一个实用程序的想法将不胜感激!
感谢。
答案 0 :(得分: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"))
更新:
像 tail -f /var/log/mail.log -n 0 这样的东西,使用 doseq ,因此实际上会消耗这些更改。
(doseq [line (tail-seq "/var/log/mail.log")] (println line))
答案 1 :(得分:3)
您可以使用RandomAccessFile
直接搜索文件末尾并从那里搜索换行符。不像take-last
方法那样优雅和简短,但对于大文件大小也不是O(n)
。
但tail -f
没有解决方案。可能会在JLogTailer中找到一些灵感。
答案 2 :(得分:2)
类似的东西:
(take-last 10 (line-seq (clojure.contrib.io/reader "file")))