Comme kotarak déclaré, vous pouvez utiliser RandomAccessFile de chercher à la fin du fichier. Malheureusement, vous devez être occupé-attendre/dormir pour les changements.
En utilisant une séquence paresseuse, vous pouvez traiter les lignes "sur la volée":
(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"))
Mise à jour:
Quelque chose comme tail -f /var/log/mail.log -n 0, en utilisant doseq, de sorte que les modifications sont effectivement consommées.
(doseq [line (tail-seq "/var/log/mail.log")] (println line))
Merci pour le pointeur! Pour une raison quelconque, cela ne semble pas agir comme prévu - les changements de fichiers ne semblent pas être détectés! – viksit
(Le programme s'arrête après le premier changement de fichier) – viksit
S'il vous plaît vérifier ma mise à jour: Aussi peut-être écrire dans le fichier n'est pas "ligne-buffered"? –