ryoakg
4/25/2016 - 5:47 AM

zip-archive.clj

(require '[clojure.java.io :as io])
(import (java.util.zip ZipOutputStream ZipEntry))

(defmacro ^:private with-zip-entry
  [[zip-output-stream entry-name] & body]
  `(try
     (.putNextEntry ^ZipOutputStream ~zip-output-stream
                    (ZipEntry. ^String ~entry-name))
     ~@body
     (finally (.closeEntry ~zip-output-stream))))

(with-open [os (io/output-stream "/tmp/a.zip")
            zs (ZipOutputStream. os)]
  (->> ["/etc/passwd" "/etc/group" "/etc/services"]
       (map (fn [f]
              (with-zip-entry [(-> f io/file .getName) zs]
                (with-open [in (io/input-stream f)]
                  (io/copy in zs)))))
       dorun))