6

私は自分のleinプロジェクトのリソースディレクトリの内容を読み取るのに苦労しています。jarとしてパッケージ化されている場合、ファイルシステムを使用するだけでは機能しないため、clojure.java.io / resourceを使用してリソースを引き出すことを(しばらく間間違って行った後)理解しました。

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

これはを返しますBufferedInputStream。私がやりたいのは、このzipファイルを取得してローカルディレクトリに解凍することです。私はそれから作ることはできませんがZipFile、私は作ることができますZipInputStream。残念ながら、私はこれから抜け出すことができますが、実際にの内容を読むZipEntries必要があります。私がすることができます:ZipFileZipEntry

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

ZipEntryこれは名前を返しますが、APIドキュメントには、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 に答える