Jersey 客户端下载 ZIP 文件并高效解压

Jersey Client download ZIP file and unpack efficiently

所以,我有一个 returns ZIP 文件的服务器应用程序,我正在处理大文件 (>=5GB)。然后我使用球衣客户端从这个应用程序发出 GET 请求,之后我想基本上提取 ZIP 并将其保存为文件夹。这是客户端配置:

Client client = ClientBuilder.newClient();
client.register(JacksonJaxbJsonProvider.class);
client.register(MultiPartFeature.class);
return client;

这是从服务器获取响应的代码:

client.target(subMediumResponseLocation).path("download?delete=true").request()
                                           .get().readEntity(InputStream.class)

然后我的代码经历了一堆(对这个问题不重要的)步骤,最后开始写入数据。

try (ZipInputStream zis = new ZipInputStream(inputStream)) {
   ZipEntry ze = zis.getNextEntry();
   while(ze != null){
     String fileName = ze.getName();
     if(fileName.contains(".")) {
       size += saveDataInDirectory(folder,zis,fileName);
     }
     is.closeEntry();
     ze = zis.getNextEntry();
  }
  zis.closeEntry();
} finally {
  inputStream.close();
}

现在我遇到的问题是 ZipInputStream 拒绝工作。我可以调试应用程序并看到 InputStream 中有字节,但是当它到达 while(ze != null) 检查时,第一个条目 returns 为空,导致目录为空。

我也试过使用将客户端的 InputStream 写入 ByteArrayOutputStream transferTo 方法,但我得到一个 java 堆 space 错误,指出数组长度太大(即使我的堆 space 设置是 Xmx=16gb 和 Xms=12gb ).

我的想法是,也许由于 InputStream 是由 Jersey 直接使用 UrlConnector 延迟加载的,因此这与 ZipInputStream 反应不佳。另一个可能的问题是我没有为 ZipInputStream.

使用 ByteArrayInputStream

什么是合适的解决方案(记住堆问题)?

好的,所以我解决了它,显然我的请求是在路径中添加查询参数时收到 404....path("download?delete=true")