Java 压缩文件主要通过 ZipOutputStream 实现,ZipOutputStream 有 5 个关键的方法:
putNextEntry()
向压缩包中添加子文件,并设置文件路径和名称(压缩包解压后得到的文件叫子文件),该方法接受一个 ZipEntry 对象,创建 ZipEntry 对象时传递路径名称,如果路径名称中存在 /,/ 前面表示文件夹,/ 后面表示文件名称,每次向压缩包中添加新的子文件都要调用一次 putNextEntry() 方法。write()
当调用 putNextEntry() 方法之后,就需要通过 write() 方法写入子文件内容。closeEntry()
每次写入子文件完毕后都需要调用 closeEntry() 方法,表示当前子文件写入已经完成。finish()
刷新流对象。close()
释放流对象。
简单压缩文件案例:
public static void main(String[] args) throws IOException {
// 需要压缩的两个文件路径
String filePath1 = "D:\\文件01.txt";
String filePath2 = "D:\\文件02.txt";
// 需要压缩文件的流对象
FileInputStream fis1 = new FileInputStream(filePath1);
FileInputStream fis2 = new FileInputStream(filePath2);
// 定义压缩包输出流对象,文件以 .zip 结尾
FileOutputStream outputStream = new FileOutputStream("D:\\文件.zip");
// 定义压缩包对象
ZipOutputStream zip = new ZipOutputStream(outputStream);
// 设置第一个文件的名称
zip.putNextEntry(new ZipEntry("压缩-文件01.txt"));
// 往压缩包中写入第一个文件
byte[] bytes = new byte[1024 * 1024];
int length = 0;
while ((length = fis1.read(bytes)) != -1) {
zip.write(bytes, 0, length);
}
// 停止第一个文件的写入
zip.closeEntry();
// 设置第二个文件的名称
zip.putNextEntry(new ZipEntry("压缩-文件02.txt"));
// 往压缩包中写入第二个文件
while ((length = fis2.read(bytes)) != -1) {
zip.write(bytes, 0, length);
}
// 停止第二个文件的写入
zip.closeEntry();
// 结束压缩
zip.finish();
// 释放资源
outputStream.close();
zip.close();
fis2.close();
fis1.close();
}
效果如下:
提示:如果需要将文件上传到文件服务器,那么可能需要将输出流 OutputStream 转成输入流 InputStream,可以通过 ByteArrayOutputStream 和 ByteArrayInputStream 来实现:
// 创建输出流对象
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 通过输出流生成输入流
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());