称为 soap 网络服务,其中 returns 一个 zip 文件作为附件。如何在内存中解压?

called a soap web service which returns a zip file as an attachment. How to unzip it in memory?

我看过有关如何使用 Java 解压缩文件的帖子,其中 zip 文件位于磁盘上的某个位置。在我的情况下是不同的。

我有调用 soap 网络服务的代码。服务响应包括一个附件,它是一个 zip 文件。我已经能够得到附件。这是代码的一部分:

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

所以,我将 zip 文件作为一种类型 "AttachmentPart" 但是我也可以这样做:

byte[] arr1 = att.getRawContentBytes();

这会给我包含 zip 文件的字节数组。

我也可以

Object obj = att.getContent()

因此,我可以在不同 formats/types 中获取 zip 文件。 zip 文件包含两个 .csv 文件,我必须对这些文件执行不同的操作。为了让我的问题更简单,我现在要做的就是获取两个 .csv 文件并将其内容打印到控制台。

我想做的一切都在记忆中。我不想将 zip 文件的内容放在磁盘上。

如何解压附件并打印内容?

如果您从 AttachmentPart 对象中获取 att.getRawContent(),您可以将其传递给内置的 ZipInputStream 以读取 zip 文件的内容。然后可以将从ZipInputStream读取的字节直接写入System.out,在控制台查看内容。

下面是一个示例,它应该读取 zip 内容,然后将条目名称和条目内容写入标准输出,假设您将包含 zip 文件的 AttachmentPart 传递给它。它还将过滤掉任何目录条目,以便不打印它们。

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);
            }
        }
    }
}