file – 字节数组上的Clojure吐出行为

以下代码:

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

然后该文件包含正确的内容“hello”.

吐痰为什么会这样?有没有办法扩展它的字节行为?

最佳答案
这个问题并不特定于字节数组.

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

转载注明原文:file – 字节数组上的Clojure吐出行为 - 代码日志