字节数组上的Clojure吐出行为

时间:2016-02-22 14:48:25

标签: 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表现得像这样?有没有办法扩展它的字节行为?

2 个答案:

答案 0 :(得分:3)

原因是内容传递给str

您可以通过(source spit)检查:

user=> (source spit)
(defn spit
  "Opposite of slurp.  Opens f with writer, writes content, then
  closes f. Options passed to clojure.java.io/writer."
  {:added "1.2"}
  [f content & options]
  (with-open [^java.io.Writer w (apply jio/writer f options)]
    (.write w (str content))))
;            - ^^^ - here

因此你得到了写入的字节数组的字符串表示

编辑:从spit slurp LOAD DATA INFILE 'file' IGNORE INTO TABLE table CHARACTER SET UTF8 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' 的“逆”给你一个字符串,它是有意义的并且是一致的行为

答案 1 :(得分:3)

此问题并非特定于字节数组。

$.ajaxSetup({cache: true}); 

查看source of spit,您会看到它只是在写出之前尝试获取参数的字符串表示形式。

您可以尝试在写入之前将任何字节数组包装在新字符串中,但要注意选择正确的编码。

(spit "spit.txt" (Object.))
(slurp "spit.txt")              ;; => "java.lang.Object@90b293d"