所有都在内存中实现,将生成的多个文件的输出流转换成为byte数组塞入压缩包的输出流中,最后下载该压缩包时显示进度条的代码
时间: 2023-06-02 15:01:52 浏览: 153
示例代码:
```java
public class FileZipUtil {
public static void zipFiles(List<File> files, String zipFileName, HttpServletResponse response) throws Exception {
// 创建压缩包输出流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 创建ZipOutputStream对象,将压缩包输出流作为参数传入
ZipOutputStream zos = new ZipOutputStream(bos);
// 设置压缩级别
zos.setLevel(Deflater.DEFAULT_COMPRESSION);
// 遍历文件列表,将每个文件压缩并写入压缩包输出流中
for (File file : files) {
// 获取文件输入流
FileInputStream fis = new FileInputStream(file);
// 创建ZipEntry对象,表示压缩包中的一个文件
ZipEntry entry = new ZipEntry(file.getName());
// 将ZipEntry对象添加到ZipOutputStream对象中
zos.putNextEntry(entry);
// 将文件内容写入ZipOutputStream对象中
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
zos.write(buffer, 0, len);
}
// 关闭ZipEntry对象
zos.closeEntry();
// 关闭文件输入流
fis.close();
}
// 关闭ZipOutputStream对象
zos.close();
// 将压缩包输出流中的内容转换成byte数组
byte[] bytes = bos.toByteArray();
// 创建文件输出流
OutputStream os = response.getOutputStream();
// 设置响应头信息,指定下载文件名和文件类型
response.setHeader("Content-Disposition", "attachment;filename=" + zipFileName + ".zip");
response.setContentType("application/octet-stream;charset=UTF-8");
// 获取byte数组长度
int len = bytes.length;
// 设置缓冲区大小
int bufferSize = 1024;
// 计算需要分多少次传输
int times = len % bufferSize == 0 ? len / bufferSize : len / bufferSize + 1;
// 设置进度条初始值为0
int process = 0;
// 循环写入文件内容到响应输出流中,并更新进度条
for (int i = 0; i < times; i++) {
int start = i * bufferSize;
int end = Math.min(len, (i + 1) * bufferSize);
os.write(bytes, start, end - start);
os.flush();
// 更新进度条
process = (int) (((double) (i + 1)) / times * 100);
// 将进度条信息写入响应输出流中
os.write(("data:" + process + "%\n\n").getBytes(StandardCharsets.UTF_8));
os.flush();
}
// 关闭输出流
os.close();
}
}
```
使用示例:
```java
List<File> files = new ArrayList<>();
files.add(new File("file1.txt"));
files.add(new File("file2.txt"));
files.add(new File("file3.txt"));
FileZipUtil.zipFiles(files, "test", response);
```
其中,`files`为要压缩的文件列表,`zipFileName`为生成的压缩包文件名(不包括后缀名),`response`为响应对象。在下载压缩包时,会显示一个进度条,以便用户了解下载进度。
阅读全文