2009-06-27 3 views
11

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

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

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

ответ

11

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

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

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

+0

Файлы, которые я собираюсь прочитать, являются маленькими. Макс. 200-300 Кб. –

+0

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

3

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

 
(defn byte-seq [rdr] 
    (let [result (. rdr read)] 
    (if (= result -1) 
     (do (. rdr close) nil) 
     (lazy-seq (cons result (byte-seq rdr)))))) 
Смежные вопросы