以下代码:
(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
表现得像这样?有没有办法扩展它的字节行为?
答案 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"