2

我想在我的 Clojure 基准测试中重定向标准输入。我已将文件作为参数传递,我试图在 java 中找到等效代码: System.setIn(new FileInputStream(filename)); 但是对于Clojure

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

这就是我想要做的..但仍然不起作用..我认为 br 具有来自 in 的标准输入,并且它被程序的其余部分使用。当我在 args 中有所需的路径时,如何更改 in,以便我可以正确运行基准测试?这是我对“系统/设置”的努力

(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))) 
4

2 回答 2

1

System.in通常包裹在*in*. 它是一个动态绑定,旨在通过 在本地范围内反弹binding,如下所示:

(with-open [is (clojure.java.io/reader "/tmp/foo.txt")]
  (binding [*in* is]
    (println (read-line))))

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

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

(with-open [is (clojure.java.io/input-stream filename)]
  (System/setIn is)
  (do-stuff))

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

编辑:关于你的程序,如果你正在创建缓冲区,你真的需要创建它们*in*吗?与仅打开自己的流有什么区别?

于 2014-07-18T13:42:37.750 回答
0

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

我不得不在缓冲区内使用文件阅读器,所以代码是这样的:

(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 包含文件名...

于 2014-07-20T01:14:17.790 回答