在Clojure中传递一个文件?

时间:2010-12-02 06:51:00

标签: file-io clojure

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

感谢。

3 个答案:

答案 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")))