Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Zip文件作为RESTAPI的输入和输出_Java_Spring Boot_Rest - Fatal编程技术网

Java Zip文件作为RESTAPI的输入和输出

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

我正在尝试创建一个API,它接收一个.zip文件,并对该文件的数据进行一些计算,然后向用户返回一个.zip文件,其中包含相同的文件和一个额外生成的文件。我的想法是使用流进行计算,在数据进入时压缩文件内容,然后直接传递出去

我有一个控制器方法:

@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分钟,使邮递员崩溃

也许数据仍然被缓存在某个地方,而我对此的理解是错误的。我如何改进此解决方案?为什么处理大量文件时速度如此之慢,而不是处理几个大文件时速度如此之慢