在我的服务中,用户可以下载非常大(5 GB以上)的数据包作为zip文件。当前实现在数据包中找到所有文件,创建一个新的zip文件,用文件副本填充该zip文件,然后将其流式传输给用户。
对于较大的数据包,这不能很好地扩展,我正在尝试找到一种提高此过程效率的方法。我在下面有一个建议的解决方案,但是我没有提供内容的经验,希望获得专业的见解,以寻求最佳解决方案。
我认为最好的方法是不将实际字节复制到zip文件中。而是,创建符号链接的zip文件,然后在流式传输内容时复制字节。我在传输过程中将字节实际复制到zip时遇到了问题,我不知道是否可能。
答案 0 :(得分:1)
您可以直接通过HTTP连接流式传输大型zip文件。
java.util.zip.ZipOutputStream
允许将数据直接压缩到流中,而无需中间存储。
下面是摘要,将文件链接的集合作为zip存档写入流中。
可能会流5GiB,您可能需要调整servlet容器的超时和线程池。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipStreamer {
public void streamZip(OutputStream os, Iterable<FileLink> entries) throws IOException {
ZipOutputStream zos = new ZipOutputStream(os);
for(FileLink e: entries) {
ZipEntry entry = new ZipEntry(e.getName());
File file = e.getFile();
entry.setTime(file.lastModified());
zos.putNextEntry(entry);
if (file.isFile()) {
copyBytes(zos, new FileInputStream(file));
}
zos.closeEntry();
}
zos.close();
}
private static void copyBytes(OutputStream dest, InputStream source) {
// copy data between streams
}
public interface FileLink {
public String getName();
public File getFile();
}
}