別のソースからZipInputStreamを受信しているので、最初のエントリのInputStreamを別のソースに提供する必要があります。
デバイスに一時ファイルを保存せずにこれを実行できることを望んでいましたが、個々のエントリのInputStreamを取得する唯一の方法は、ZipFile.getInputStream(entry)を使用することであり、ZipFileではなくZipInputStreamを使用しているためです。 、それは不可能です。
だから私が持っている最善の解決策は
考え出した:
ZipInputStream.getNextEntry()
を呼び出すと、エントリの先頭にInputStream
が配置されるため、ZipInputStream
を指定することは、ZipEntry
を指定することと同じです。 InputStream
。
ZipInputStream
は、エントリのEOFダウンストリームを処理するのに十分賢い、またはそう思われます。
p。
@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を返すことができます。
郵便番号はかなり簡単ですが、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;
}