Когда `line-seq` с` reader` закрывает файл? - PullRequest
6 голосов
/ 07 июля 2011

Я читаю строки из текстового файла, используя (line-seq (reader "input.txt")).Затем эта коллекция передается и используется моей программой.

Я обеспокоен тем, что это может быть плохим стилем, поскольку я не определяю, как закрывать файл.Я полагаю, что не могу использовать (with-open (line-seq (reader "input.txt"))), поскольку поток файлов потенциально может быть закрыт до того, как я пройду всю последовательность.

Следует ли избегать lazy-seq в сочетании с reader для файлов?Есть ли другой шаблон, который я должен использовать здесь?

Ответы [ 2 ]

15 голосов
/ 23 июля 2011

Поскольку на самом деле нет четкого ответа (все смешано с комментариями к первому ответу), вот суть этого:

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

Это заставит всю последовательность строк бытьпрочитайте и закройте файл.Затем вы можете передать результат всего этого выражения.

При работе с большими файлами у вас могут возникнуть проблемы с памятью (удержание всей последовательности строк в памяти), и тогда хорошей идеей будет инвертировать программу.:

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

В этом случае вам может понадобиться или не понадобиться doall, в зависимости от того, что возвращает my-program и / или my-program, использует ли последовательность лениво или нет.

0 голосов
/ 07 июля 2011

Кажется, что clojure.contrib.duck-streams / read-lines это именно то, что вы ищете.read-lines закрывает файл, когда нет ввода, и возвращает последовательность, аналогичную line-seq.Попробуйте посмотреть исходный код read-lines.

...