6

我一直在努力阅读我的 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 中时也可以使用!)

4

1 回答 1

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"
于 2012-04-17T09:28:24.533 回答