我在使用Clojure下载图像时遇到问题,以下代码的工作方式似乎存在问题: -
(defn download-image [url filename]
(->> (slurp url) (spit filename)))
Run Code Online (Sandbox Code Playgroud)
这将"下载"文件到我指定的位置,但是我试图用它打开它的任何图像应用程序都无法读取该文件(例如,尝试在Web浏览器中打开它只是返回一个空白页面,尝试打开它预览(osx)说这是一个损坏的文件)
我想这可能是因为slurp应该只用于文本文件而不是二进制文件
有人能指出我正确的方向让我的代码正常工作吗?任何帮助将不胜感激!
Bil*_*ill 14
slurp使用java.io.Readerunderneath,它会将表示转换为字符串,这通常与二进制数据不兼容.查找使用输入流的示例.在某些方面,这可能会更好,因为您可以将图像从输入缓冲区传输到输出缓冲区,而无需将整个内容读入内存.
编辑
由于人们似乎偶尔会发现这个问题,我需要再次重写这段代码.我以为我会添加一个例子.注意,这不会传输数据,它会将其收集到内存中并返回一个字节数组.
(require '[clojure.java.io :as io])
(defn blurp [f]
(let [dest (java.io.ByteArrayOutputStream.)]
(with-open [src (io/input-stream f)]
(io/copy src dest))
(.toByteArray dest)))
Run Code Online (Sandbox Code Playgroud)
测试...
(use 'clojure.test)
(deftest blurp-test
(testing "basic operation"
(let [src (java.io.ByteArrayInputStream. (.getBytes "foo" "utf-8"))]
(is (= "foo" (-> (blurp src) (String. "utf-8")))))))
Run Code Online (Sandbox Code Playgroud)
例...
user=> (blurp "http://www.lisperati.com/lisplogo_256.png")
#<byte[] [B@15671adf>
Run Code Online (Sandbox Code Playgroud)