Clojure, представляющий байтовый массив - PullRequest
11 голосов
/ 27 июня 2009

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

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

Я знаю, что могу создать массив из clojure, но как это сделать?

Ответы [ 2 ]

11 голосов
/ 27 июня 2009

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

Я знаю, что могу создать массив из clojure, но как это сделать?

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

3 голосов
/ 10 июля 2009

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

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