2010-12-02 60 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中找到。