2009-06-27 6 views
11

En java je lirais le fichier entier dans le tableau d'octets et ferais un peu de traitement avec lui. Maintenant, je veux implémenter le même algorithme dans clojure.Clojure représentant le tableau d'octets

Ce que je me demande est que je peux utiliser une liste au lieu d'un tableau?

Je sais que je peux créer un tableau à partir de clojure, mais quelle est la façon de gérer cela?

Répondre

11

Si le fichier en question est très volumineux, vous devez toujours envisager d'utiliser un fichier mappé en mémoire. clojure.contrib.mmap offre quelques fonctions pour faire face à cela.

Je sais que je peux créer des tableaux à partir de clojure mais quelle est la manière de les manipuler?

Je ne sais pas sur la façon Lisp, mais la façon dont Clojure vous permet d'utiliser la séquence des fonctions sur les tableaux, de sorte que vous n'avez pas à choisir entre une représentation efficace et confortable manipulation (qui à mon avis est l'un des points qui rend Clojure si pragmatique).

+0

Les fichiers que je vais lire sont petits. 200-300 Ko max. –

+0

Ensuite, créez simplement le tableau comme vous le feriez en Java et utilisez les fonctions de Clojure qui acceptent un seqable, qui fonctionne magiquement avec les tableaux. Pour tout autre conseil, vous pouvez mentionner exactement ce que vous devez faire avec le contenu. Puisque vous utilisez un tableau d'octets, je suppose que vous avez besoin de faire des choses binaires, auquel cas vous voudrez peut-être lire l'article suivant, qui illustre de bons modèles à utiliser: http://gnuvince.wordpress.com/ 2009/01/29/lecture-binaire-données-en-clojure / – pmf

3

Voici une séquence paresseuse des octets dans le fichier et ferme le handle de fichier lorsque le dernier octet a été lu. Si vous travaillez avec des séquences alimentées par des fichiers volumineux, veillez à ne pas vous accrocher à la tête de la séquence ou vous manquerez de mémoire. Vous pouvez toutefois conserver la poignée de fichier au cas où vous auriez besoin de la fermer manuellement en cas d'erreur.

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