Eclipse 在Clojure中重定向输入
我想重定向Clojure基准中的标准输入。我已将该文件作为参数传递,并尝试在java中查找等效代码: System.setIn(新文件输入流(文件名))强> 但是对于ClojureEclipse 在Clojure中重定向输入,eclipse,clojure,eclipse-kepler,dacapo,Eclipse,Clojure,Eclipse Kepler,Dacapo,我想重定向Clojure基准中的标准输入。我已将该文件作为参数传递,并尝试在java中查找等效代码: System.setIn(新文件输入流(文件名)) 但是对于Clojure 主要问题是,我使用DaCapo套件来计算基准测试的性能,加载基准测试的方法不识别特殊字符,如“系统。in通常包装在*in*中。它是一种动态绑定,旨在通过绑定在本地范围内反弹,如下所示: (with-open [is (clojure.java.io/reader "/tmp/foo.txt")] (binding [
主要问题是,我使用DaCapo套件来计算基准测试的性能,加载基准测试的方法不识别特殊字符,如“
系统。in
通常包装在*in*
中。它是一种动态绑定,旨在通过绑定在本地范围内反弹,如下所示:
(with-open [is (clojure.java.io/reader "/tmp/foo.txt")]
(binding [*in* is]
(println (read-line))))
请注意,它是系统的包装。在
中,而不是系统。在
本身,更改此绑定不会更改系统。在
中。它只影响在*
中使用*的Clojure函数,例如此处的读取行
如果您正在调用一些希望读取System.in
的Java代码,则必须调用System.setIn
:
(with-open [is (clojure.java.io/input-stream filename)]
(System/setIn is)
(do-stuff))
这些是Clojure和Java中的选项,但我仍然不确定我是否理解您的用例。如果这不太合理,请在评论中澄清
编辑:关于你的程序,如果你正在创建缓冲区,你真的需要在*
*中创建它们吗?与只打开自己的流有什么区别?在尝试了这么多不同的事情后,我终于找到了答案
我必须在缓冲区内使用文件读取器,因此代码如下:
(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
其中参数包含文件名…我有一个加载clojure benchmark revcomp的线束类。传入该基准的参数是一个数组。在该数组中,我可以拥有该基准输入的路径文件或其内容本身。如果我运行revcomp的jar,它所采用的参数是“
是一个shell,而不是Java。我想我仍然缺少一个部分。如果您从外部调用Clojure,它将读取System.in,与Java相同,并且可能是需要解决的外部问题。System.setIn(新的FileInputStream(args[0]));那么,如果我在加载revcomp基准的revcomp Harnese类中更改System.In,System.In不会更改吗?
(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