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 文件并高效解压的主要内容,如果未能解决你的问题,请参考以下文章
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