5

私の状況では、いくつかのファイル(txt、png、...)を含むzipファイルがあり、それらの名前で直接読みたいのですが、次のコードをテストしましたが、結果はありません(NullPointerExcepion):

InputStream in = Main.class.getResourceAsStream("/resouces/zipfile/test.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));

resourcesはパッケージで、zipfileはzipファイルです。

4

3 に答える 3

16

zipファイルが別のjarファイルにパックされないことが確実な場合は、次のようなものを使用できます。

URL zipUrl = Main.class.getResource("/resources/zipfile.zip");
URL entryUrl = new URL("jar:" + zipUrl + "!/test.txt");
InputStream is = entryUrl.openStream();

または:

URL zipUrl = Main.class.getResource("/resources/zipfile.zip");
File zipFile = new File(zipUrl.toURI());
ZipFile zip = new ZipFile(zipFile);
InputStream is = zip.getInputStream(zip.getEntry("test.txt"));

それ以外の場合、選択肢は次のとおりです。

  • ZipInputStreamを使用して、ロードする必要のあるエントリごとにzipファイルを1回スキャンします。すべてのリソースに同じZipInputStreamを再利用できない限り、リソースがたくさんある場合、これは遅くなる可能性があります。
  • ネストされたzipファイルにリソースをパックせず、コードを使用してjarにインライン化します。
  • ネストされたzipファイルを一時ディレクトリにコピーし、ZipFileクラスを使用してアクセスします。
于 2012-11-15T14:42:16.620 に答える
3

あなたの現在のアプローチは間違いなくうまくいきません。任意の「アクセス」スキームを作成し、何をしようとしているのかわからないクラスでそれを使用しました。できることは、 ZipInputStreamを使用して、探しているエントリを読み取ることです。

URL zipFileURL = Thread.currentThread().getContextClassLoader().getResource("zipfile.zip");
InputStream inputStream = zipFileURL.openStream();
ZipInputStream zipInputStream = new ZipInputStream(inputStream);

ZipEntry zipEntry = null;

do {
    zipEntry = zipInputStream.getNextEntry();
    if(zipEntry == null) break;
}
while(zipEntry != null && (! "textfile".equals(zipEntry.getName()));

if(zipEntry != null ) {
    // do some stuff
}

これはアドホックコードです。必要なことを実行するように修正してください。また、たとえばApache Commons IOライブラリには、Zipファイルを処理するためのより効率的なクラスがいくつかある場合があります。

于 2012-11-15T14:26:47.027 に答える
0

zipファイル内のtest.txtのパスは何ですか?このファイルを読み取るには、zipファイル内のパスを使用する必要があります。また、zipファイルがクラスパスにあることを確認してください。実際、これをjarファイルにバンドルすることができます。

于 2012-11-15T14:27:39.300 に答える