2009-06-27 26 views
11

在java中,我会将整个文件读入字节数组并对其进行一些处理。现在我想在clojure中实现相同的算法。代表字节数组的Clojure

我想知道的是我可以使用列表而不是数组?

我知道我可以从clojure创建数组,但是处理这个问题的lisp方式是什么?

回答

11

如果问题文件非常大,则应始终考虑使用内存映射文件。 clojure.contrib.mmap提供了一些功能来解决这个问题。

我知道我可以从clojure创建数组,但是处理这个问题的lisp方式是什么?

我不知道Lisp的方式,但Clojure的方式允许您使用数组上的序列功能,让您不必有效的表示和舒适的操控(这在我看来是决定之间使Clojure非常实用的一点)。

+0

我要阅读的文件很小。最大200-300 Kb。 – 2009-06-27 05:38:18

3

这里是文件中字节的惰性序列,并在读取最后一个字节时关闭文件句柄。如果您使用由大文件提供的序列,请注意不要将其保存到序列的头部,否则将耗尽内存。尽管如果您需要在错误情况下手动关闭文件,仍然可以保留文件句柄。

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