Java Zip文件作为RESTAPI的输入和输出
我正在尝试创建一个API,它接收一个.zip文件,并对该文件的数据进行一些计算,然后向用户返回一个.zip文件,其中包含相同的文件和一个额外生成的文件。我的想法是使用流进行计算,在数据进入时压缩文件内容,然后直接传递出去 我有一个控制器方法:Java Zip文件作为RESTAPI的输入和输出,java,spring-boot,rest,Java,Spring Boot,Rest,我正在尝试创建一个API,它接收一个.zip文件,并对该文件的数据进行一些计算,然后向用户返回一个.zip文件,其中包含相同的文件和一个额外生成的文件。我的想法是使用流进行计算,在数据进入时压缩文件内容,然后直接传递出去 我有一个控制器方法: @RequestMapping(value = "/sign", consumes = "application/zip", produces = "application/zip", method = RequestMethod.POST) public
@RequestMapping(value = "/sign", consumes = "application/zip", produces = "application/zip", method = RequestMethod.POST)
public void calculate(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setStatus(HttpServletResponse.SC_OK);
response.addHeader("Content-Disposition", "attachment; filename=\"result.zip\"");
ZipOutputStream responseOutputStream = new ZipOutputStream(response.getOutputStream());
byte[] calculationResult = calculationService.doCalculations(request.getInputStream(), responseOutputStream);
//Write some more stuff to responseOutputStream based on calculations result
request.getInputStream().close();
responseOutputStream.close();
}
以及一种服务方法:
public byte[] doCalculations(InputStream zipFileStream, ZipOutputStream outputStream) throws Exception {
ByteArrayOutputStream calculationResultStream = new ByteArrayOutputStream();
ZipInputStream zipInputStream = new ZipInputStream(zipFileStream);
ZipEntry zipEntry = zipInputStream.getNextEntry();
while (zipEntry != null) {
//Output entry
ZipEntry zipOutEntry = new ZipEntry(zipEntry.getName());
outputStream.putNextEntry(zipOutEntry);
int bytesRead;
byte[] tempBuffer = new byte[8192 * 10];
while ((bytesRead = zipInputStream.read(tempBuffer)) != -1) {
outputStream.write(tempBuffer, 0, bytesRead);
}
//Do some quite light calculations
//calculationResultStream.write(byte[] calcRes);
zipEntry = zipInputStream.getNextEntry();
}
calculationResultStream.close();
return calculationResultStream.toByteArray();
}
我的想法是永远不要在内存中写任何东西,以避免大文件的内存不足。当我给它一个带有单个大文件(2GB)的.zip文件时,它会在大约25秒内处理它,但当我给它一个包含1000个小文件(每个文件大小为1-5MB)的.zip文件时,问题就出现了,然后它会运行大约10分钟,使邮递员崩溃
也许数据仍然被缓存在某个地方,而我对此的理解是错误的。我如何改进此解决方案?为什么处理大量文件时速度如此之慢,而不是处理几个大文件时速度如此之慢