如下代码:

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

09-25 21:20