clojure:解压缩存储为资源的zip文件

时间:2012-04-17 08:53:21

标签: jar clojure zip

我一直在努力阅读我的lein项目中资源目录的内容。我现在明白了(在做了一段时间后做错了)使用clojure.java.io/resource来提取资源,因为当它打包成jar时只使用文件系统不起作用:

> (require '[clojure.java.io :as io])
> (def zipzip (.openStream (io/resource "zip.zip")))

这会返回BufferedInputStream。我想要做的是获取此zip文件并将其解压缩到本地目录。我无法使用ZipFile,但我可以制作ZipInputStream。不幸的是,虽然我可以从中获取ZipEntries,但我需要ZipFile来实际阅读ZipEntry的内容。我可以这样做:

> (-> zipzip ZipInputStream. .getNextEntry .getName)

这会返回名称,但api文档中没有任何内容可以使用ZipEntry获取ZipInputStream的实际内容!

如何将此ZipInputStream中的内容写出到本地目录? (当代码打包到jar中时也可以使用!)

1 个答案:

答案 0 :(得分:8)

您可以在下一个条目后阅读ZipInputStream。使用条目中的大小信息来阅读内容。

user=> (import 'java.util.zip.ZipInputStream)
java.util.zip.ZipInputStream
user=> (def zs (ZipInputStream. (io/input-stream "foo.zip")))
#'user/zs
user=> (def ze (.getNextEntry zs))
#'user/ze
user=> (.getName ze)
"foo.txt"
user=> (.getSize ze)
21
user=> (let [bytes (byte-array 21)] (.read zs bytes 0 21) (String. bytes "UTF-8"))
"Das ist ein Test!\r\n\r\n"