Jersey Client 下载 ZIP 文件并高效解压

Posted

技术标签:

【中文标题】Jersey Client 下载 ZIP 文件并高效解压【英文标题】:Jersey Client download ZIP file and unpack efficiently 【发布时间】: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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于Jersey Client 下载 ZIP 文件并高效解压的主要内容,如果未能解决你的问题,请参考以下文章

Java 上传和下载文件(附加密和解密)

Java 上传和下载文件(附加密和解密)

jersey之get,put,post,delete简单使用

Jersey实现Client端:GET/PUT/POST/DELETE

用Jersey构建RESTful服务5--Jersey+MySQL5.6+Hibernate4.3

com.sun.jersey.api.client.UniformInterfaceException ... returned a response status of 403 Forbidden