web-dev-qa-db-ja.com

zipinputstreamからzipentryのinputstreamを取得することは可能ですか?

別のソースからZipInputStreamを受信して​​いるので、最初のエントリのInputStreamを別のソースに提供する必要があります。

デバイスに一時ファイルを保存せずにこれを実行できることを望んでいましたが、個々のエントリのInputStreamを取得する唯一の方法は、ZipFile.getInputStream(entry)を使用することであり、ZipFileではなくZipInputStreamを使用しているためです。 、それは不可能です。

だから私が持っている最善の解決策は

  1. 着信InputStreamをファイルに保存
  2. ファイルをZipFileとして読み取る
  3. 最初のエントリのInputStreamを使用する
  4. 一時ファイルを削除します。
28
pstanton

考え出した:

ZipInputStream.getNextEntry()を呼び出すと、エントリの先頭にInputStreamが配置されるため、ZipInputStreamを指定することは、ZipEntryを指定することと同じです。 InputStream

ZipInputStreamは、エントリのEOFダウンストリームを処理するのに十分賢い、またはそう思われます。

p。

34
pstanton

@pstantonの投稿に加えて、ここにコードの例があります。次のコードを使用して問題を解決しました。例がなければ、前の答えが何であるかを理解することは困難でした。

//If you just want the first file in the zipped InputStream use this code. 
//Otherwise loop through the InputStream using getNextEntry()
//till you find the file you want.
private InputStream convertToInputStream(InputStream stream) throws IOException {
    ZipInputStream zis = new ZipInputStream(stream);
    zis.getNextEntry();
    return zis;
} 

このコードを使用すると、zip形式のファイルのInputStreamを返すことができます。

15
Whitecat

郵便番号はかなり簡単ですが、ZipInputStreamをInputstreamとして返す際に問題が発生しました。何らかの理由で、Zip内に含まれる一部のファイルの文字が削除されました。以下は私の解決策であり、これまでのところ機能しています。

private Map<String, InputStream> getFilesFromZip(final DataHandler dhZ,
        String operation) throws ServiceFault {
    Map<String, InputStream> fileEntries = new HashMap<String, InputStream>();
    try {
        ZipInputStream zipIsZ = new ZipInputStream(dhZ.getDataSource()
        .getInputStream());

        try {
            ZipEntry entry;
            while ((entry = zipIsZ.getNextEntry()) != null) {
                if (!entry.isDirectory()) {
                    Path p = Paths.get(entry.toString());
                    fileEntries.put(p.getFileName().toString(),
                    convertZipInputStreamToInputStream(zipIsZ));
                }
            }
        }
        finally {
            zipIsZ.close();
        }

    } catch (final Exception e) {
        faultLocal(LOGGER, e, operation);
    }

    return fileEntries;
}
private InputStream convertZipInputStreamToInputStream(
final ZipInputStream in) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    IOUtils.copy(in, out);
    InputStream is = new ByteArrayInputStream(out.toByteArray());
    return is;
}
0
EdwinR