Clojure, представляющий массив байтов

В java я бы прочитал весь файл в массив байтов и выполнил с ним некоторую обработку. Теперь я хочу реализовать тот же алгоритм в clojure.

Мне интересно, могу ли я использовать список вместо массива?

Я знаю, что могу создать массив из clojure, но как с этим справиться lisp?


person Hamza Yerlikaya    schedule 27.06.2009    source источник


Ответы (2)


Если рассматриваемый файл очень большой, всегда следует использовать файл с отображением памяти. clojure.contrib.mmap предлагает некоторые функции для решения этой проблемы.

Я знаю, что могу создать массив из clojure, но как с этим справиться lisp?

Я не знаю, как в Lisp, но в Clojure вы можете использовать функции последовательности для массивов, поэтому вам не нужно выбирать между эффективным представлением и удобной обработкой (что, на мой взгляд, является одним из моментов, которые делают Clojure такой прагматичный).

person pmf    schedule 27.06.2009
comment
Затем просто создайте массив, как в Java, и используйте функции Clojure, которые принимают seqable, которые волшебным образом работают с массивами. Для получения дополнительных советов вы можете указать, что именно вам нужно делать с контентом. Поскольку вы используете массив байтов, я предполагаю, что вам нужно делать бинарные вещи, и в этом случае вы можете прочитать следующую статью, которая иллюстрирует некоторые хорошие шаблоны для использования: gnuvince.wordpress.com/2009/01/29/ - person pmf; 27.06.2009

вот ленивая последовательность байтов в файле, которая закрывает дескриптор файла, когда прочитан последний байт. Если вы работаете с последовательностями, загруженными огромными файлами, будьте осторожны, чтобы нигде не держаться за начало последовательности, иначе у вас закончится память. Однако можно удерживать дескриптор файла на случай, если вам нужно вручную закрыть его в случае ошибки.

(defn byte-seq [rdr]
  (let [result (. rdr read)]
    (if (= result -1)
      (do (. rdr close) nil)
      (lazy-seq (cons result (byte-seq rdr))))))
person Arthur Ulfeldt    schedule 10.07.2009