Supponendo che stiamo solo facendo file di testo qui e non certo roba binario pazzo.
Numero 1: come leggere un intero file in memoria.
(slurp "/tmp/test.txt")
Non consigliato quando si tratta di un file molto grande.
Numero 2: come leggere un file riga per riga.
(use 'clojure.java.io)
(with-open [rdr (reader "/tmp/test.txt")]
(doseq [line (line-seq rdr)]
(println line)))
Il with-open
macro prende cura che il lettore è chiuso alla estremità del corpo. La funzione lettore costringe una stringa (può anche fare un URL, ecc.) In uno BufferedReader
. line-seq
consegna un seq pigro. Richiedere il prossimo elemento dei risultati lazy seq in una riga viene letta dal lettore.
Si noti che da Clojure 1.7 in poi, è anche possibile utilizzare transducers per leggere i file di testo.
Numero 3: come scrivere in un nuovo file.
(use 'clojure.java.io)
(with-open [wrtr (writer "/tmp/test.txt")]
(.write wrtr "Line to be written"))
Nuovamente, with-open
prende cura che il BufferedWriter
è chiusa alla fine del corpo. Writer costringe una stringa in un BufferedWriter
, che si utilizza l'utilizzo tramite Java interoperabilità: (.write wrtr "something").
Si potrebbe anche usare spit
, l'opposto di slurp
:
(spit "/tmp/test.txt" "Line to be written")
Numero 4: aggiungere una riga a un file esistente .
(use 'clojure.java.io)
(with-open [wrtr (writer "/tmp/test.txt" :append true)]
(.write wrtr "Line to be appended"))
Come sopra, ma ora con opzione di aggiunta.
O ancora con spit
, l'opposto di slurp
:
(spit "/tmp/test.txt" "Line to be written" :append true)
PS: essere più espliciti circa il fatto che si sta leggendo e scrivendo in un file e non qualcosa d'altro, si poteva creare prima un oggetto File e poi costringere in un Writer BufferedReader
o:
(reader (file "/tmp/test.txt"))
;; or
(writer (file "tmp/test.txt"))
funzione Il file è anche in clojure.java.io.
PS2: A volte è utile essere in grado di vedere quale sia la directory corrente (così "."). È possibile ottenere il percorso assoluto in due modi:
(System/getProperty "user.dir")
o
(-> (java.io.File. ".") .getAbsolutePath)
primo risultato di Google: http: //lethain.com/reading-file-in-clojure/ – jcubic
Questo risultato è del 2009, alcune cose sono state cambiate ultimamente. – Sergey
Infatti. Questa domanda StackOverflow è ora il primo risultato su Google. – mydoghasworms