首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure中重定向输入

在Clojure中重定向输入
EN

Stack Overflow用户
提问于 2014-07-18 08:59:18
回答 2查看 407关注 0票数 2

我想重定向Clojure基准测试中的标准输入。我将该文件作为参数传递,并试图在java中找到相应的代码:System.setIn(新FileInputStream(文件名));,但用于Clojure

主要问题是,我使用DaCapo套件来计算基准测试的性能,而加载基准测试的方法与cmd (直接从cmd.运行基准测试的jar )相比,不识别诸如"<“这样的特殊字符。

这就是我想做的,do..but仍然不起作用。我认为br有来自in的标准输入,它被程序的其他部分所使用。如何在具有所需路径的args中更改in,以便正确运行基准测试?这是我在"system/setin“上的努力

代码语言:javascript
复制
(defn -main [& args]
  (let [max-dna-chars-per-line 60
    jk  (with-open [is (clojure.java.io/input-stream (first args))]
        (System/setIn is))
        br (java.io.BufferedReader. *in*)
        bw (java.io.BufferedWriter. *out* (* 16 8192)) ; 16 * default size, I think
        ;; We could use the map complement-dna-char-map instead of
        ;; complement-dna-char-fn, but when I tested that, the program
        ;; spent a lot of time running the hashCode method on
        ;; characters.  I'm hoping this is faster.
        complement-dna-char-vec (make-vec-char-mapper complement-dna-char-map)]
    (loop [[desc-str dna-seq-str more] (fasta-slurp-br br)]
      (println-string-to-buffered-writer bw desc-str)
      (print-reverse-complement-of-str-in-lines bw dna-seq-str
                                                complement-dna-char-vec
                                                max-dna-chars-per-line)
      (when more
        (recur (fasta-slurp-br br))))
    (. bw flush))) 
EN

回答 2

Stack Overflow用户

发布于 2014-07-18 13:42:37

System.in通常包装在*in*中。它是一个动态绑定,可以在本地范围内使用binding进行反弹,如下所示:

代码语言:javascript
复制
(with-open [is (clojure.java.io/reader "/tmp/foo.txt")]
  (binding [*in* is]
    (println (read-line))))

请注意,它是System.in的包装器,而不是System.in本身,而更改此绑定不会更改System.in。它只影响使用*in*的Clojure函数,例如此处的read-line

如果您正在调用一些想要读取System.in的Java代码,则必须调用System.setIn

代码语言:javascript
复制
(with-open [is (clojure.java.io/input-stream filename)]
  (System/setIn is)
  (do-stuff))

这些是Clojure和Java中的选项,但我仍然不确定我是否理解您的用例。如果这样做不太合理,请在评论中加以澄清。

编辑:对于您的程序,如果要创建缓冲区,真的需要在*in*上创建缓冲区吗?和打开你自己的溪流有什么区别?

票数 1
EN

Stack Overflow用户

发布于 2014-07-20 01:14:17

在尝试了这么多不同的事情之后,我终于找到了答案.

我必须在缓冲区内使用文件读取器,因此代码如下所示:

代码语言:javascript
复制
(defn -main [& args]
  (let [max-dna-chars-per-line 60
        br (java.io.BufferedReader. (clojure.java.io/reader (first args)))
        bw (java.io.BufferedWriter. *out* (* 16 8192)) ; 16 * default size, I think

其中的args包含文件名..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24821061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档