【问题标题】:Jersey Client download ZIP file and unpack efficientlyJersey Client 下载 ZIP 文件并高效解压
【发布时间】:2021-11-23 08:54:02
【问题描述】:

所以,我有一个返回 ZIP 文件的服务器应用程序,并且我正在处理大文件 (>=5GB)。然后,我使用 jersey 客户端从该应用程序发出 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) 检查时,它在第一个条目上返回 null,从而导致一个空目录。

我还尝试使用将 InputStream 从客户端写入 ByteArrayOutputStream transferTo 方法,但我得到一个 java 堆空间错误,说数组长度太大(即使我的堆空间设置是 Xmx=16gb 和 Xms=12gb)。

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

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

【问题讨论】:

    标签: java rest jersey zip


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-03-07
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2021-03-03
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多