(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))