2010-12-02 65 views
9

在Clojure中尾部文件最好的方法是什么?我还没有遇到任何有助于这样做的公用事业公司,但如何构建公用事业公司的想法将不胜感激!在Clojure中拖尾文件?

谢谢。

回答

12

由于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")) 

更新:

喜欢的东西尾-f /var/log/mail.log -n 0,使用doseq,所以变化实际上被消耗。

(doseq [line (tail-seq "/var/log/mail.log")] (println line)) 
+0

感谢您的指针!出于某种原因,这似乎没有按预期行事 - 文件更改似乎没有被发现! – viksit 2010-12-02 22:29:53

2

喜欢的东西:

(take-last 10 (line-seq (clojure.contrib.io/reader "file"))) 
3

您可以使用RandomAccessFile直接寻找到文件的末尾,并从那里寻找换行符。不像take-last方法那样优雅和简短,但也不是O(n),这对于大文件大小可能很重要。

虽然没有解决方案tail -f。一些灵感可能在JLogTailer中找到。