Этот фрагмент кода запускается на сервере и обнаруживает изменения в файле и отправляет его клиенту. Это работает впервые, и после этого длина файла не обновляется, даже я изменил файл и сохранил его. Я предполагаю, что неизменность clojure является причиной здесь. Как я могу сделать эту работу?Получение того же экземпляра RandomAccessFile в clojure
(def clients (atom {}))
(def rfiles (atom {}))
(def file-pointers (atom {}))
(defn get-rfile [filename]
(let [rdr ((keyword filename) @rfiles)]
(if rdr
rdr
(let [rfile (RandomAccessFile. filename "rw")]
(swap! rfiles assoc (keyword filename) rfile)
rfile))))
(defn send-changes [changes]
(go (while true
(let [[op filename] (<! changes)
rfile (get-rfile filename)
ignore (println (.. rfile getChannel size))
prev ((keyword filename) @file-pointers)
start (if prev prev 0)
end (.length rfile) // file length is not getting updated even if I changed the file externally
array (byte-array (- end start))]
(do
(println (str "str" start " end" end))
(.seek rfile start)
(.readFully rfile array)
(swap! file-pointers assoc (keyword filename) end)
(doseq [client @clients]
(send! (key client) (json/write-str
{:changes (apply str (map char array))
:fileName filename}))
false))))))
Спасибо за ответ. Я уверен, что добавляю данные в конец файла. Этот код отправляет добавленные изменения клиенту, если я каждый раз создаю новый RandomAccessFile, а не кеширую файловый объект. (println (str «str» start «end» end)) сообщает мне, что после создания файла его размер остается неизменным. Поэтому я думал, что get-rfile всегда дает новую копию. – FourOfAKind
Я тестировал код локально, и когда я добавляю некоторые данные в файл (например, «echo» hello »>>./Foo.txt' или с помощью редактора), а затем отправляю изменения на канал« changes », изменение обнаружено и зарегистрирует правильную информацию. И когда я повторяю процесс, он работает нормально. Я не думаю, что проблема возникает из 'get-rfile' или' file-pointers' **, если ** никакой другой процесс не возится с файлом данных ... –
Thats interesting. Для этого я использую TextEdit. Я попробую использовать другой редактор и увижу, не имеет значения. (Я не думаю, что это будет). – FourOfAKind