我一直在努力读出我的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 文档中没有任何内容可以通过ZipInputStream
获取该ZipEntry
的实际内容!
如何将此ZipInputStream
中的内容写出到本地目录? (当代码打包到罐子中时,这也有效!
您可以在获得下一个条目后简单地从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!rnrn"