如何在 clojure 中下载文件并将其从内存中解压?

2024-02-13

我正在使用 clj-http 发出 GET 请求,响应是一个 zip 文件。此 zip 的内容始终是一个 CSV 文件。我想将 CSV 文件保存到磁盘,但我不知道如何保存。

如果我在磁盘上有该文件,(fs/unzip filename destination)来自 Raynes/fs 库的效果很好,但我不知道如何将 clj-http 的响应强制转换为可以读取的内容。如果可以的话我想直接解压文件而不用

我得到的最接近的(如果甚至接近)让我到达 BufferedInputStream,但我从那里迷失了。

(require '[clj-http.client :as client])
(require '[clojure.java.io :as io])

(->
  (client/get "http://localhost:8000/blah.zip" {:as :byte-array})
  (:body)
  (io/input-stream))

您可以使用纯java java.util.zip.ZipInputStream http://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipInputStream.html or java.util.zip.GZIPInputStream http://docs.oracle.com/javase/7/docs/api/java/util/zip/GZIPInputStream.html。取决于内容的压缩方式。这是使用 java.util.zip.GZIPInputStream 保存文件的代码:

(->
  (client/get "http://localhost:8000/blah.zip" {:as :byte-array})
  (:body)
  (io/input-stream)
  (java.util.zip.GZIPInputStream.)
  (clojure.java.io/copy (clojure.java.io/file "/path/to/output/file")))

使用 java.util.zip.ZipInputStream 只会让它变得更复杂一点:

(let [stream (->
                (client/get "http://localhost:8000/blah.zip" {:as :byte-array})
                (:body)
                (io/input-stream)
                (java.util.zip.ZipInputStream.))]
      (.getNextEntry stream)
      (clojure.java.io/copy stream (clojure.java.io/file "/path/to/output/file")))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 clojure 中下载文件并将其从内存中解压? 的相关文章

随机推荐