2010-12-02 13 views
9

Clojure'da bir dosyayı kuyruğa sokmanın en iyi yolu ne olurdu? Buna yardımcı olacak herhangi bir yardımcı programa rastlamadım, ama nasıl inşa edileceğine dair fikirler takdir edilecek!Clojure'da bir dosyaya mi yollanıyor?

Teşekkürler. gibi

cevap

12

, sen Dosya sonuna aramaya RandomAccessFile kullanabilirsiniz. Maalesef değişiklikler için meşgul beklemek/uyumak zorundasınız.

(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")) 

Güncelleme:

şey -f /var/log/mail.log tail -n gibi tembeller dizisini siz "on-the-fly" satırları işleyebilir kullanma

dozq kullanarak 0, böylece değişiklikler gerçekten tüketilir. pointer için

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

teşekkürler! Bazı nedenlerden dolayı, bu amaçlanan gibi davranmıyor gibi görünüyor - dosya değişiklikleri tespit edilmiyor gibi görünüyor! – viksit

+0

(Program ilk dosya değişikliğinden sonra durur) – viksit

+0

Lütfen güncellememi kontrol edin: Ayrıca dosyaya yazmak da "satır-tamponlu" değil? –

2

şey:

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

Dosyanın sonuna doğrudan aramak ve oradan satır aralıklarında aramak için RandomAccessFile kullanabilirsiniz. take-last yaklaşımı kadar zarif ve kısa değil, aynı zamanda büyük dosya boyutları için önemli olabilecek O(n).

tail -f için çözüm yok. Bazı ilham kaynakları JLogTailer'da bulunabilir. kotarak belirtildiği gibi