Хвост файла в Clojure? - PullRequest
       2

Хвост файла в Clojure?

9 голосов
/ 02 декабря 2010

Каков наилучший способ создания файла в Clojure?Я не сталкивался ни с какими утилитами, которые бы помогли сделать это, но идеи о том, как их создать, были бы оценены!

Ответы [ 3 ]

13 голосов
/ 02 декабря 2010

Как указано 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 , с использованием дозыq , поэтому изменения фактически потребляются.

(doseq [line (tail-seq "/var/log/mail.log")] (println line))
3 голосов
/ 02 декабря 2010

Вы можете использовать RandomAccessFile для прямого поиска в конце файла и поиска разрывов строк оттуда.Не такой элегантный и короткий, как подход take-last, но также и не O(n), что может иметь значение для файлов большого размера.

Хотя для tail -f решения не существует.Некоторое вдохновение можно найти в JLogTailer .

2 голосов
/ 02 декабря 2010

Что-то вроде:

(take-last 10 (line-seq (clojure.contrib.io/reader "file")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...