要实现 Java 批量文件压缩导出并下载到本地,需要完成以下步骤:
- 构建压缩文件流
- 将文件流写入输出流
- 设置 HTTP 响应头信息
- 导出压缩文件
可以使用 java.util.zip
包中的 ZipOutputStream
对文件进行压缩。
以下是一个示例代码,实现将多个文件打成一个压缩包,压缩包文件名为 example.zip
,然后将压缩包导出并下载到本地。
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class FileCompress {
public static void main(String[] args) throws Exception {
// 待压缩的文件数组
File[] files = new File[]{new File("file1.txt"), new File("file2.txt"), new File("file3.txt")};
// 压缩后的文件名
String zipFileName = "example.zip";
// 输出流
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName));
// 遍历待压缩的文件数组,分别进行压缩
for (File file : files) {
FileInputStream fis = new FileInputStream(file);
ZipEntry entry = new ZipEntry(file.getName());
zos.putNextEntry(entry);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
fis.close();
zos.closeEntry();
}
zos.close();
// 设置 HTTP 响应头信息
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + zipFileName);
// 导出压缩文件
InputStream in = new FileInputStream(zipFileName);
OutputStream out = response.getOutputStream();
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
File zipFile = new File(zipFileName);
if(zipFile.exists()) {
zipFile.delete();
}
}
}
以上代码中 File[] files
数组中的元素表示待压缩的文件,String zipFileName
是压缩后的文件名。在遍历待压缩的文件数组时,先创建 FileInputStream
对象读入文件,然后创建 ZipEntry
对象表示待压缩的文件,使用 ZipOutputStream
的 putNextEntry
方法将其添加到压缩包中,然后使用 FileOutputStream
对象创建压缩后的文件,并将其写入输出流中。请求结束后,通过设置 HTTP 响应头信息和导出压缩文件的方式实现下载到本地。
以下是另一个示例代码,实现将一个目录下的所有子目录和文件打成一个压缩包,并将压缩包导出并下载到本地。
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class DirectoryCompress {
public static void main(String[] args) throws Exception {
// 待压缩目录
String srcDirPath = "/example/dir";
// 压缩后的文件名
String zipFileName = "example.zip";
// 输出流
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName));
// 创建文件对象
File srcDir = new File(srcDirPath);
// 调用递归压缩方法进行压缩
compress(srcDir, zos, "");
zos.close();
// 设置 HTTP 响应头信息
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + zipFileName);
// 导出压缩文件
InputStream in = new FileInputStream(zipFileName);
OutputStream out = response.getOutputStream();
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
File zipFile = new File(zipFileName);
if(zipFile.exists()) {
zipFile.delete();
}
}
/**
* 递归压缩方法
*/
private static void compress(File sourceFile, ZipOutputStream zos, String name) throws Exception {
byte[] buf = new byte[1024];
if (sourceFile.isFile()) {
//在 Zip 压缩包中添加文件条目
zos.putNextEntry(new ZipEntry(name + sourceFile.getName()));
// 读取待压缩的文件并将其添加到 Zip 压缩包中
int len;
FileInputStream in = new FileInputStream(sourceFile);
while ((len = in.read(buf)) > 0) {
zos.write(buf, 0, len);
}
// 关闭文件流
in.close();
} else {
// 如果是目录,则递归调用
File[] files = sourceFile.listFiles();
if (files == null || files.length == 0) {
zos.putNextEntry(new ZipEntry(name + "/"));
} else {
for (File file : files) {
compress(file, zos, name + sourceFile.getName() + "/");
}
}
}
}
}
以上代码首先定义了待压缩目录的路径 srcDirPath
和压缩后的文件名 zipFileName
,然后通过递归方法 compress
实现对整个目录进行递归压缩。在 compress
方法中,判断若是文件,则读取该文件并将其写入到 ZipOutputStream
的输出流中;若是目录,则递归调用方法。最后导出压缩文件的方式和前面示例代码类似。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 批量文件压缩导出并下载到本地示例代码 - Python技术站