2011-07-07 12 views
6

(line-seq (reader "input.txt"))'u kullanarak bir metin dosyasından satırları okuyorum. Bu koleksiyon daha sonra benim programım tarafından kullanıldı ve kullanıldı. Ben deterministik dosyayı kapatma değilim olarak`line` seq` ile` line` seq ', dosya ne zaman kapatılır?

Ben, bu ancak kötü tarzı olabileceğini endişeleniyorum. Tüm diziyi geçmeden önce dosya akışı potansiyel olarak kapanacağından, (with-open (line-seq (reader "input.txt"))) kullanamayacağımı hayal ediyorum.

lazy-seq dosyalar için reader birlikte kaçınılmalıdır? Burada kullanmam gereken farklı bir desen var mı? Bu clojure.contrib.duck-streams/read-lines gibi görünüyor

cevap

15

, burada Bunun özü bulunuyor ve dosyayı kapatın. Daha sonra bu ifadenin sonucunu etrafından geçirebilirsiniz.

Büyük dosyalarla çalışma zaman, bellek sorunları olabilir (bellekteki çizgilerin bütün dizisi tutarak) ve programı ters çevirmek için iyi bir fikirdir işte o zaman:

(with-open [r (reader "input.txt")] 
    (doall (my-program (line-seq r)))) 

Sen ya gerek olmayabilir Bu durumda, programımın ne geri döndüğüne ve/veya programımın sıralı olarak tükenip tükenmediğine bağlı olarak.

0

Aradığınız şey. read-lines, giriş olmadığında dosyayı kapatır ve diziyi line-seq gibi döndürür. read-lines kaynak koduna bakmaya çalışın. hatlarının tüm sıralamayı zorlayacak

(with-open [r (reader "input.txt")] 
    (doall (line-seq r))) 

okunacak: Bu gerçekten (hepsi ilk yanıt yapılan yorumlar içine karıştığını) net bir yanıt olmadığı için

+1

clojure.contrib.duck-stream'ler kullanımdan kaldırılmıştır: http://clojure.github.com/clojure-contrib/#duck-streams – pauldoo

+0

@pauldoo Bunu fark etmedim. Haklısınız, ancak 'line-seq' ve' read-line' işlevleri, okuyucudan dizeleri (.readLine ile) almak için aynı modeli kullanır. Sadece (onlara bakmak [line-seq] (https://github.com/clojure/clojure/blob/f86db9cc68773dd3e4a166c1ff7b81e4a98aa602/src/clj/clojure/core.clj#L2314), [okuma-line] (https: // github.com/clojure/clojure-contrib/blob/aa3f018f65006c78b08703e7adef04b7f39e1542/src/main/clojure/clojure/contrib/duck_streams.clj#L236)), size kaynak koduna 'salt line' kapmak tembellik istiyorum. Başka bir çözüm de görebileceğiniz gibi – m039

+0

@pauldoo tembelliğe kullanmak ve bir değişkene içine bütün içeriğini almak ya da sadece okuyucuda .close kullanmak değildir. Ve 'with-open' (açık-açık [r (reader "input.txt")] (make-smth-on-lines (line-seq r))) ') gibi' 'open' kullanılmalıdır. – m039