我有大约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。
答案 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。