Clojure, представляющий массив байтов
В java я бы прочитал весь файл в байтовый массив и обработал его. Теперь я хочу реализовать тот же алгоритм в clojure.
Что мне интересно, могу ли я использовать список вместо массива?
Я знаю, что могу создать массив из clojure, но каков способ lisp справиться с этим?
Ответы
Ответ 1
Если этот файл очень большой, вы всегда должны использовать файл с отображением памяти. clojure.contrib.mmap
предлагает некоторые функции для решения этой проблемы.
Я знаю, что могу создать массив из clojure, но что такое lisp способ справиться с этим?
Я не знаю о способе lisp, но способ clojure позволяет использовать функции последовательности на массивах, поэтому вам не нужно выбирать между эффективным представлением и удобной обработкой (что, на мой взгляд, является одной из точек, которая делает clojure настолько прагматичной).
Ответ 2
здесь представляет собой ленивую последовательность байтов в файле и закрывает дескриптор файла, когда последний бит был прочитан. Если вы работаете с последовательностями, загружаемыми огромными файлами, будьте осторожны, чтобы не удерживать головку последовательности в любом месте или у вас не хватит памяти. Это нормально, чтобы удерживать файл дескриптора файла, если вам нужно вручную закрыть его в состоянии ошибки.
(defn byte-seq [rdr]
(let [result (. rdr read)]
(if (= result -1)
(do (. rdr close) nil)
(lazy-seq (cons result (byte-seq rdr))))))