называется мыльным веб-сервисом, который возвращает zip-файл в виде вложения.Как распаковать его в память? - PullRequest
0 голосов
/ 09 июля 2019

Я видел сообщения о том, как разархивировать файлы с помощью Java, где zip-файл находится где-то на диске.В моем случае все по-другому.

У меня есть код, который вызывает мыльный веб-сервис.Ответ службы включает в себя вложение, которое представляет собой ZIP-файл.Я смог получить вложение.Вот часть кода:

 Iterator<?> i = soapResponse.getAttachments();
 Object obj = null;
 AttachmentPart att = (AttachmentPart) i.next();

Итак, у меня есть zip-файл типа «AttachmentPart», однако я мог бы также сделать:

byte[] arr1 = att.getRawContentBytes();

, что даст мне массивиз байтов, содержащих zip-файл.

Я также мог бы сделать

Object obj = att.getContent()

Итак, я могу получить zip-файлы в различных форматах / типах.Zip-файлы содержат два CSV-файла, и я должен делать разные вещи с этими файлами.Чтобы упростить мой вопрос, все, что я сейчас собираюсь сделать, - это получить два CSV-файла и распечатать их содержимое на консоли.

Я хочу сделать все, что в памяти.Я не хочу помещать содержимое zip-файлов на диск.

Как распаковать вложение и распечатать содержимое?

1 Ответ

2 голосов
/ 09 июля 2019

Если вы берете att.getRawContent() из объекта AttachmentPart, вы можете передать его во встроенный ZipInputStream для чтения содержимого zip-файла.Затем вы можете записать прочитанные байты из ZipInputStream напрямую в System.out, чтобы просмотреть содержимое на консоли.

Ниже приведен пример, который должен прочитать содержимое zip, а затем записать имя записи, а затем содержимое записи в стандартный формат, при условии, что вы передадите ему AttachmentPart, который содержит zip-файл.Также будут отфильтрованы все записи, которые являются каталогами, чтобы они не печатались.

public static void printAttachmentPartZip(AttachmentPart att) throws IOException, SOAPException {
    try (ZipInputStream zis = new ZipInputStream(att.getRawContent())) {
        byte[] buffer = new byte[1024];
        for (ZipEntry zipEntry = zis.getNextEntry(); zipEntry != null; zipEntry = zis.getNextEntry()) {
            if (zipEntry.isDirectory()) {
                continue;
            }
            System.out.println(zipEntry.getName());
            for (int len = zis.read(buffer); len > 0; len = zis.read(buffer)) {
                System.out.write(buffer, 0, len);
            }
        }
    }
}
...