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