2012-04-17 9 views
6

私はleinプロジェクトのresourcesディレクトリの内容を読み出すのに苦労しています。私はそれは、JARとしてパッケージ化されたときだけファイルシステムを使用して動作しないため、リソースを引き出すためにclojure.java.io/resourceを使用する(しばらくの間、それは間違っているの後に)今理解:clojure:リソースとして保存されているzipファイルの解凍

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

これはBufferedInputStreamを返します。私がしたいのは、このzipファイルをローカルディレクトリに展開することです。私はそれからZipFileを作ることはできませんが、私はZipInputStreamを作ることができます。残念ながら、私はこのうちZipEntriesを得ることができますが、実際にはZipEntryの内容を読むにはZipFileが必要です。

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

これは名前を返しますが、ZipInputStreamとそのZipEntryの実際の内容を取得するためのAPIドキュメントには何もありません:私はこれを行うことができます!

このZipInputStreamのコンテンツをローカルディレクトリに書き出すにはどうすればよいですか? (コードはjarファイルにパッケージ化されたときにも動作します!)

答えて

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" 
関連する問題