我正在使用一个将文本输出到控制台的 Java 包,我需要捕获字符串中的文本,但我不知道如何执行此操作。从查看 Clojure 文档看来,我所要做的就是将 java 调用包装在with-out-str
但这对我不起作用。
最小代码示例:如果我尝试
(with-out-str
(.println (System/out) "foo"))
我希望得到一个值为“foo”的字符串,但它仍然输出到控制台。我究竟做错了什么?
Java's System.out.println(...)
是一个电话println
的方法PrintStream
实例。您需要更换System.out
使用您自己的实例进行流式传输并捕获其内容:
(import [java.io ByteArrayOutputStream PrintStream])
(def out-buffer (java.io.ByteArrayOutputStream.))
(System/setOut (java.io.PrintStream. out-buffer true "UTF-8"))
(defn out-str []
(.toString out-buffer "UTF-8"))
但在 REPL 中要小心,因为它使用System.out
打印结果,这样当您全局替换它时,它将破坏您的 REPL 实例。
您甚至可以编写一个宏来捕获System.out
然后恢复原来的样子PrintStream
实例:
(defmacro with-system-out-str [& body]
`(let [out-buffer# (ByteArrayOutputStream.)
original-out# System/out
tmp-out# (PrintStream. out-buffer# true "UTF-8")]
(try
(System/setOut tmp-out#)
~@body
(finally
(System/setOut original-out#)))
(.toString out-buffer# "UTF-8")))
(with-system-out-str
(.println System/out "Hi"))
;; => "Hi\n"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)