Подтвердить что ты не робот

Возможно ли получить входной поток zipentry из zipinputstream?

Я получаю ZipInputStream из другого источника, и мне нужно предоставить первую запись InputStream в другой источник.

Я надеялся сделать это без сохранения временного файла на устройстве, однако единственный способ получить InputStream для отдельной записи - через ZipFile.getInputStream(запись), и поскольку у меня есть ZipInputStream и а не ZipFile, что невозможно.

Итак, лучшее решение у меня есть

  • сохранить входящий InputStream в файл
  • читать файл как ZipFile
  • использовать первую запись InputStream
  • удалить временный файл.
4b9b3361

Ответ 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;
}