2009-06-27 8 views
11

In Java würde ich die ganze Datei in Byte-Array lesen und einige Verarbeitung damit zu tun. Jetzt möchte ich den gleichen Algorithmus in clojure implementieren.Clojure stellvertretend für Byte-Array

Was ich frage mich ist, kann ich eine Liste anstelle eines Arrays verwenden?

Ich weiß, ich kann Array von Clojure erstellen, aber was ist der Lisp-Weg, dies zu handhaben?

Antwort

11

Wenn die betreffende Datei sehr groß ist, sollten Sie immer eine Speicherabbilddatei in Betracht ziehen. clojure.contrib.mmap bietet einige Funktionen, um damit umzugehen.

Ich weiß, ich kann Array von Clojure erstellen, aber was ist der Lisp-Weg, dies zu handhaben?

ich nicht über die Lisp Art und Weise kennen, aber die Clojure Weise können Sie die Sequenzfunktionen auf Arrays verwenden, so müssen Sie sich zwischen einer effizienten Darstellung und komfortable Handhabung (was meiner Meinung nach nicht entscheiden einer der Punkte, der Clojure so pragmatisch macht).

+0

Dateien, die ich lesen werde, sind klein. 200-300 Kb max. –

+0

Dann erstellen Sie einfach das Array wie in Java und verwenden Sie Clojures Funktionen, die ein Seqable akzeptieren, das magisch mit Arrays arbeitet. Für weitere Beratung können Sie erwähnen, was genau Sie mit dem Inhalt tun müssen. Da Sie ein Byte-Array verwenden, gehe ich davon aus, dass Sie Binärdateien benötigen. In diesem Fall sollten Sie den folgenden Artikel lesen, in dem einige nützliche Muster dargestellt werden: http://gnuvince.wordpress.com/ 2009/01/29/reading-binary-daten-in-clojure / – pmf

3

Hier ist eine Lazy-Sequenz der Bytes in der Datei und schließt das Dateihandle, wenn das letzte Byte gelesen wurde. Wenn Sie mit Sequenzen arbeiten, die von riesigen Dateien gespeist werden, achten Sie darauf, dass Sie den Kopf der Sequenz nicht irgendwo festhalten oder dass Ihnen der Speicher ausgeht. Es ist in Ordnung, den Dateigriff zu behalten, falls Sie ihn in einem Fehlerzustand manuell schließen müssen.

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