возможно ли получить входной поток zipentry из zipinputstream? - PullRequest
28 голосов
/ 13 июля 2010

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

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

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

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

Ответы [ 3 ]

34 голосов
/ 13 июля 2010

фигурный:

вполне возможно, вызов ZipInputStream.getNextEntry() позиционирует InputStream в начале записи и, следовательно, предоставление ZipInputStream эквивалентно предоставлению ZipEntry.InputStream.

ZipInputStream достаточно умен, чтобы справиться с EOF записи вниз по течению, или так кажется.

p.

14 голосов
/ 31 января 2013

В дополнение к посту @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 файла, который был заархивирован.

0 голосов
/ 17 ноября 2016

Почтовый индекс довольно прост, но у меня были проблемы с возвратом 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;
}
...