如下代码:
(spit "/Users/nha/tmp/spit.txt" (.getBytes "hello"))
生成一个包含“ [B @ 71e054bc””的文件,该文件与内容无关(在本例中为“ hello”),因为这是JVM representation of the address of a byte array。
但是,以下工作原理(取自this SO post):
(clojure.java.io/copy
(.getBytes "hello")
(java.io.File. "/Users/nha/tmp/spit.txt"))
然后该文件包含正确的内容“你好”。
为什么
spit
这样表现?有没有一种方法可以扩展它的字节行为? 最佳答案
此问题并非字节数组所独有。
(spit "spit.txt" (Object.))
(slurp "spit.txt") ;; => "java.lang.Object@90b293d"
查看source of
spit
,您会发现它只是在尝试写出参数之前尝试获取字符串表示形式。您可以尝试在写入之前将任何字节数组包装在新字符串中,但要小心选择正确的编码。
;; platform-dependent!
(spit "spit.txt" (String. b))
;; better
(spit "spit.txt" (String. b java.nio.charset.StandardCharsets/UTF_8))