Java 使用Jax-rs从ZipOutPutStream下载Zip文件

Java 使用Jax-rs从ZipOutPutStream下载Zip文件,java,Java,我正在使用ByteArrayOutputStream和zipoutpsteam创建一个zip文件,但是创建一个大约200mb的大zip文件需要很大的延迟。有什么有效的方法吗 URL u = new URL(url); URLConnection uc = u.openConnection(); ByteArrayOutputStream out = new ByteArrayOutputStream(); ZipOutputSt

我正在使用ByteArrayOutputStream和zipoutpsteam创建一个zip文件,但是创建一个大约200mb的大zip文件需要很大的延迟。有什么有效的方法吗

        URL u = new URL(url);
        URLConnection  uc = u.openConnection();

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ZipOutputStream zipOut = new ZipOutputStream( out );
        zipOut.putNextEntry( new ZipEntry( "file.csv" ) );
        zipOut.write(IOUtils.toByteArray(uc.getInputStream()));
        uc.getInputStream().close();
        zipOut.closeEntry();
        zipOut.close();

        ResponseBuilder response = Response.ok(out.toByteArray());
        response.header("Content-Disposition", "attachment; 
        filename=\"LMPeriod.zip\"");
        return response.build();

使用FileOutputStream而不是ByteArrayOutputStream将zip写入磁盘。
ByteArrayOutputStream将压缩结果缓存在内存中。如果要将其写入磁盘,则必须将ZipOutputStream包装在FileOutputStream周围。

使用FileOutputStream而不是ByteArrayOutputStream将zip写入磁盘。
ByteArrayOutputStream将压缩结果缓存在内存中。如果要将其写入磁盘,必须将ZipOutputStream包装在FileOutputStream周围。

这如何解决压缩文件耗时过长的问题?将文件写入磁盘通常至少比内存访问慢20倍(内存1微秒,磁盘SSD 16微秒,压缩1kB约2微秒)。这是如何解决压缩文件耗时过长的问题的?将文件写入磁盘通常至少比内存访问慢20倍(内存1微秒,磁盘SSD 16微秒,压缩1kB约2微秒)。您可以尝试使用压缩级别。您可以预压缩文件。也就是说,有一些工作在后台进行压缩。您可以缓存压缩的文件。压缩本身仍然需要大约2微秒的1kB数据+从文件系统读取数据。使用您的解决方案(将整个文件读入内存并在内存中压缩),当有多个并发下载请求时,您可能会遇到内存问题。您可以尝试使用压缩级别。您可以预压缩文件。也就是说,有一些工作在后台进行压缩。您可以缓存压缩的文件。压缩本身仍然需要大约2微秒的1kB数据+从文件系统读取数据。使用您的解决方案(将整个文件读入内存并在内存中压缩),当有多个并发下载请求时,您可能会遇到内存问题。