当在使用Java生成需要的文件时,我们可能同时需要将文件进行压缩,这时我们或许就需要用到ZipOutputStream类。ZipOutputStream类可以以ZIP格式写入文件输出实现压缩。通过ZipOutputStream类实现文件压缩步骤如下
1、通过构造器 ZipOutputStream( OutputStream ) 创建ZIP输出流,需要指定压缩文件生成路径,文件格式为ZIP
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream("E:/Hello World.zip"));
2、通过 putNextEntry( ZipEntry ) 方法在ZIP输出流中写入ZIP文件条目。ZipEntry 类表示ZIP文件条目,需要通过类中的构造器ZipEntry ( ZipEntry ) 或 ZipEntry ( String ) 创建ZIP文件条目,也可以通过ZipEntry类中的其它方法设置文件条目的其它属性
zipOutputStream.putNextEntry(new ZipEntry("Hello World.txt"));
3、通过字节输入流获取需要压缩的源文件数据,然后使用输入流的字节长度声明字节数组,最后将输入流数据写入字节数组中
InputStream inputStream = new FileInputStream("D:/Hello World.txt");
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
4、通过 write( byte[] ) 方法将字节数组写入当前 ZIP 条目数据。
zipOutputStream.write(buffer);
5、关闭流
inputStream.close();
zipOutputStream.close();
以下是将指定目录以及目录下所有标准文件和子目录进行压缩实例
public static void main(String[] args) {
ZipOutputStream zipOutputStream=null;
InputStream inputStream=null;
try {
//创建ZIP输出流
zipOutputStream = new ZipOutputStream(new FileOutputStream("E:/Hello World.zip"));
//声明List集合存放源目录下的文件路径
List<String> list = new ArrayList<String>();
//通过封装的方法获取源目录下所有标准文件路径
list(new File("D:/Hello World"),list);
//循环获取到的路径集合添加ZIP条目
for (String file : list) {
//在ZIP输出流中添加ZIP文件条目,需要将获取的路径截取至源目录的相对路径
zipOutputStream.putNextEntry(new ZipEntry(file.substring(2)));
//通过路径创建输入流,将输入流数据写入字节数组
inputStream = new FileInputStream(file);
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
//将字节数组写入当前条目数据
zipOutputStream.write(buffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
//关闭流
zipOutputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//通过递归获取文件夹中所有文件路径的集合
public static void list(File file, List<String> list) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
list.add(files[i].getPath());
} else {
if (files[i].list() != null) {
list(files[i], list);
}
}
}
}