代码之家  ›  专栏  ›  技术社区  ›  Dave Kirby

如何在clojure中读取stdin(*in*)中的行

  •  31
  • Dave Kirby  · 技术社区  · 16 年前

    我正在编写我的第一个clojure程序,想从stdin中读取行。

    (doall (map #(println %) (line-seq *in*)))
    

    我得到一个例外:

    Exception in thread "main" java.lang.ClassCastException: clojure.lang.LineNumberingPushbackReader cannot be cast to java.io.BufferedReader (test.clj:0)
    

    我在1.0版和1.1版中得到了相同的结果

    那么我如何转换呢 *in* 变成一个我可以迭代的序列?我本以为这已经足够普遍了 *在* 它本身是可移植的,但这也不起作用-如果我尝试直接使用它,我会得到:

    java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.LineNumberingPushbackReader (NO_SOURCE_FILE:0)
    

    另外,是否有在clojure中进行常规文件处理的示例?

    4 回复  |  直到 16 年前
        1
  •  36
  •   bfontaine cat-walk    9 年前

    试试包装 *in* java.io.BufferedReader . 并且还使用 doseq 而不是 doall ,正如devstopfix指出的:

    (doseq [ln (line-seq (java.io.BufferedReader. *in*))]
       (println ln))
    

    注意 line-seq 有文件证明需要 BufferedReader 作为它的源头。

        2
  •  22
  •   Mike Crittenden    14 年前

    请注意,对于那些只想读一行的人来说,这里有 read-line

        3
  •  22
  •   Evgeniy Berezovsky    12 年前

    你可能应该使用 doseq 而不是 doall :

    (doseq [line (line-seq (java.io.BufferedReader. *in*))] 
        (println line))
    

    道尔 :

    遍历seq的连续nexts,保留头部并返回它,从而使整个seq一次驻留在内存中。

    多塞克 :

    不保留序列的开头。返回零。

        4
  •  6
  •   mrucci Bernhard Zürn    7 年前

    对于合理的小投入,以下措施也适用:

    (let [input-string (slurp *in*)]
      (println input-string))
    

    或者,按行拆分:

    (let [lines (clojure.string/split-lines (slurp *in*))]
      (println lines))
    
    推荐文章