在clojure中压缩文件

jer*_*eca 5 zip clojure

我想在clojure中压缩文件,但我找不到任何库.

你知道在Clojure中压缩文件或文件夹的好方法吗?我必须使用java库吗?

kot*_*rak 14

ZipOutputStreamJava中有一个可以在Clojure中使用的库存.我不知道某个地方是否有图书馆.我使用普通的Java函数和一个小助手宏:

(defmacro ^:private with-entry
  [zip entry-name & body]
  `(let [^ZipOutputStream zip# ~zip]
     (.putNextEntry zip# (ZipEntry. ~entry-name))
     ~@body
     (flush)
     (.closeEntry zip#)))
Run Code Online (Sandbox Code Playgroud)

显然,每个ZIP条目都描述了一个文件.

(require '[clojure.java.io :as io])

(with-open [file (io/output-stream "foo.zip")
            zip  (ZipOutputStream. file)
            wrt  (io/writer zip)]
  (binding [*out* wrt]
    (doto zip
      (with-entry "foo.txt"
        (println "foo"))
      (with-entry "bar/baz.txt"
        (println "baz")))))
Run Code Online (Sandbox Code Playgroud)

要压缩文件,您可能需要执行以下操作:

(with-open [output (ZipOutputStream. (io/output-stream "foo.zip"))
            input  (io/input-stream "foo")]
  (with-entry output "foo"
    (io/copy input output)))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 !ZipOutputStream 的导入是:`(:import [java.util.zip ZipOutputStream])`。 (2认同)
  • 是的...因为我忘记了 ZipEntry : `(:import [java.util.zip ZipEntry ZipOutputStream])` (2认同)