是否有更好的方法在java中压缩大文件?

时间:2017-10-13 18:53:58

标签: java zip

我有大约5到6个大文件,每个大小3 GB。我的目标是压缩这些文件然后使用文件servlet传输它。我当前的代码需要花费大量的时间才能在浏览器上进行超时会话。是否有更好的方法来压缩文件。

File zipFile=new File( downloadedFileLocation.getAbsolutePath()+"/Download.zip" );
         FileOutputStream fos = new FileOutputStream(zipFile);
         ZipOutputStream zos = new ZipOutputStream(fos);
         for( File f:downloadedFileLocation.listFiles() ) {
            byte[] buffer = new byte[1024];
            ZipEntry ze= new ZipEntry(f.getName());
            zos.putNextEntry(ze);
            FileInputStream in = new FileInputStream(f.getAbsolutePath());

            int len;
            while ((len = in.read(buffer)) > 0) {
               zos.write(buffer, 0, len);
            }

            in.close();
            zos.closeEntry();
            f.delete();
         }
         zos.close();
         fos.close();

更改缓冲区大小会有什么不同吗?

任何人都可以建议任何更好的方式,可以更快地完成zip。

2 个答案:

答案 0 :(得分:3)

  

任何人都可以建议任何更好的方式来拉链可以更快地完成

不,你不能更快地拉链,但你可以“现场”。

在传输之前,请勿将压缩内容写入临时文件。直接写入Servlet中的OutputStream

结果是压缩内容在压缩时传输,因此连接不会超时,总响应时间也会减少。

您还应该使用try-with-resources进行资源管理,并使用较新的NIO文件类,以便于使用和更好的错误消息。

这样的事情:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("application/zip");
    try (ZipOutputStream zos = new ZipOutputStream(resp.getOutputStream())) {
        for (File f : downloadedFileLocation.listFiles()) {
            zos.putNextEntry(new ZipEntry(f.getName()));
            Files.copy(f.toPath(), zos);
            Files.delete(f.toPath());
        }
    }
}

我将delete()留在那里,但是根据你正在做的事情,这样做可能不合适。或者至少,在下载完成之前,即在for循环结束之前,您不应该删除。

答案 1 :(得分:0)

恕我直言,总有一种更好的做事方法。最近(当然是Java 7 NIO),我了解了NIO压缩文件的方式,并且它的方式比到目前为止的任何常规方法都快。我还没有计算时间的数字,但是它的速度几乎是迄今为止任何常规方法的两倍。

值得一试。请参阅this