Возможно ли получить входной поток zipentry из zipinputstream?
Я получаю ZipInputStream из другого источника, и мне нужно предоставить первую запись InputStream в другой источник.
Я надеялся сделать это без сохранения временного файла на устройстве, однако единственный способ получить InputStream для отдельной записи - через ZipFile.getInputStream(запись), и поскольку у меня есть ZipInputStream и а не ZipFile, что невозможно.
Итак, лучшее решение у меня есть
- сохранить входящий InputStream в файл
- читать файл как ZipFile
- использовать первую запись InputStream
- удалить временный файл.
Ответы
Ответ 1
понял:
ZipInputStream.getNextEntry()
возможно, что вызов ZipInputStream.getNextEntry()
позиционирует InputStream
в начале записи, и поэтому предоставление ZipInputStream
эквивалентно предоставлению ZipEntry
InputStream
.
ZipInputStream
достаточно умен, чтобы обрабатывать вход EOF в нисходящем направлении, или так кажется.
п.
Ответ 2
В дополнение к сообщению @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;
}
Используя этот код, вы можете вернуть InputStream файла, который был заархивирован.
Ответ 3
Почтовый индекс довольно прост, но у меня возникли проблемы с возвратом ZipInputStream в качестве входного потока. По некоторым причинам некоторые из файлов, содержащихся в 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;
}