5

zip ファイル内のファイルを検索して、.zip ファイルとして取得しようとしていますInputStream。ですから、これは私がこれまでのところそれを達成するために行っていることであり、正しく行っているかどうかはわかりません.

オリジナルが少し長いので、これがサンプルですが、これが主なコンポーネントです...

public InputStream Search_Image(String file_located, ZipInputStream zip) 
    throws IOException {
    for (ZipEntry zip_e = zip.getNextEntry(); zip_e != null ; zip_e = zip.getNextEntry()) {
        if (file_located.equals(zip_e.getName())) {
            return zip;
        }
        if (zip_e.isDirectory()) {
            Search_Image(file_located, zip); 
        }
    }
    return null;
}

今私が直面している主な問題は、ZipInputStreamインSearch_Imageが元のコンポーネントと同じであることZipInputStreamです...

if(zip_e.isDirectory()) {
    //"zip" is the same as the original I need a change here to find folders again.
    Search_Image(file_located, zip); 
}

質問ですが、ZipInputStreamを新しい として取得するにはどうすればよいですzip_entryか? また、このクラスのロジックがまだ不足しているため、メソッドで何か間違ったことをした場合は追加してください。

4

3 に答える 3

9

ZipFile入力ストリームがまだ必要ない場合は、気にせずにクラスを使用する必要があります。

ZipFile file = new ZipFile("file.zip");
ZipInputStream zis = searchImage("foo.png", file);

public InputStream searchImage(String name, ZipFile file) {
  for (ZipEntry e : Collections.list(file.entries())) {
    if (e.getName().endsWith(name)) {
      return file.getInputStream(e);
    }
  }
  return null;
}

いくつかの事実:

  • コード内のメソッドと変数の命名規則に従う必要があります (Search_Imageそれは問題ありませんsearchImage) 。
  • zip ファイル内のディレクトリにはファイルが含まれていません。これらは他のすべてのものと同様に単なるエントリであるため、それらに再帰しようとしないでください)。
  • endsWith(name)ファイルがフォルダー内にある可能性があり、zip 内のファイル名には常にパスが含まれているため、を使用して指定した名前を比較する必要があります。
于 2012-06-20T16:13:13.677 に答える
5

を使用して zip エントリにアクセスすることは明らかにその方法ではありません。パフォーマンスは zip ファイル内のエントリの合計量に依存するため、スケーラブルなアプローチZipInputStreamではないエントリを反復処理する必要があるためです。

可能な限り最高のパフォーマンスを得るには、アーカイブのサイズに関係なく、メソッドのおかげでエントリに直接アクセスするZipFileためにa を使用する必要があります。getEntry(name)

public InputStream searchImage(String name, ZipFile zipFile) throws IOException {
    // Get the entry by its name
    ZipEntry entry = zipFile.getEntry(name);
    if (entry != null) {
        // The entry could be found
        return zipFile.getInputStream(entry);
    }
    // The entry could not be found
    return null;
}

ここで指定する名前は、パス区切りとして使用するアーカイブ内の画像の相対パスであるため、ディレクトリ内にあるもの/にアクセスする場合、予想される名前は.foo.pngbarbar/foo.png

于 2016-10-12T18:18:08.113 に答える