ZipOutputStream
ZipOutputStream
压缩流
此流用于以 ZIP 文件格式写入文件,包括对压缩和未压缩条目的支持,也就是把文件打包成压缩文件,常用于附件下载(多文件下载),文件压缩存储。
常用API
public void putNextEntry(ZipEntry e);
开始写入新的 ZIP 文件条目并将流定位到条目数据的开头。如果仍处于活动状态,则关闭当前条目。
这里的ZipEntry就是一个条目
public void closeEntry();
关闭当前 ZIP 条目并定位流以写入下一个条目
条目类:ZipEntry(表示 ZIP 文件条目)
通过例子了解ZipEntry:
如下:
new ZipEntry(name):这个name是什么,解压后的文件结构就是什么
我有一个文件是:D:\CaptureTest\filepath\1.jpg,
而name = "Image\01.jpg"
生成压缩文件后,再解压的文件结构就是"Image\01.jpg"
步骤如下:
1.创建ZipOutputStream对象.创建此对象时,需要传入一个OutputStream对象作为参数,此OutputStream对象通常是指向要创建的ZIP文件的FileOutputStream对象
2.创建ZipEntry对象:ZipEntry表示ZIP文件中的一个条目。创建此对象时,需要传入一个字符串作为参数,此字符串是条目的名字,可以包含路径
3.将ZipEntry对象添加到ZipOutputStream对象中:通过调用ZipOutputStream对象的putNextEntry方法,将ZipEntry对象添加到ZIP文件中。此方法将开始写入新的ZIP文件条目。
4.写入条目内容:接下来,就可以将要压缩的文件内容写入ZipOutputStream对象了。通常,这是通过读取要压缩的文件的内容,然后写入ZipOutputStream对象来完成的。
5.关闭ZipEntry对象:写入条目内容后,需要调用ZipOutputStream对象的closeEntry方法,关闭当前的ZipEntry对象,以便开始写入下一个条目。
6.关闭ZipOutputStream对象:最后,完成所有条目的写入后,需要调用ZipOutputStream对象的close方法,关闭流,以完成ZIP文件的创建。
示例
public static void main(String[] args) throws IOException {
String baseDir = "E:\\ProfessionalDoc\\Java";
String zipFileName = baseDir.concat("\\aaa.zip");
File srcFileFirst = new File(baseDir.concat("\\").concat("java1018.md"));
File srcFileSecond = new File(baseDir.concat("\\").concat("head-first-design-patterns-2nd.pdf"));
//
FileOutputStream fileOutputStream = null;
ZipOutputStream zipOutputStream = null;
try {
fileOutputStream = new FileOutputStream(zipFileName);
zipOutputStream = new ZipOutputStream(fileOutputStream);
compressFile(srcFileFirst, zipOutputStream);
compressFile(srcFileSecond, zipOutputStream);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
zipOutputStream.flush();
fileOutputStream.flush();
IOUtils.closeQuietly(zipOutputStream, fileOutputStream);
}
}
private static void compressFile(File srcFile, ZipOutputStream zipOutputStream) throws IOException {
ZipEntry zipEntry = new ZipEntry(srcFile.getName());
try (FileInputStream srcFileStream = new FileInputStream(srcFile)) {
zipOutputStream.putNextEntry(zipEntry);
srcFileStream.transferTo(zipOutputStream);
} catch (FileNotFoundException e) {
throw e;
} finally {
zipOutputStream.closeEntry();
}
}