用到的流:
ZipOutputStream 压缩流 ZipInputStream 解压流
代码如下:
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class io_12_ZipStream {
/**
* 文件的压缩与解压
* @param args
*/
public static void main(String[] args) {
//压缩
// compression("D:\\z1\\test.zip",new File("D:\\z2"));
//解压
deCompression("D:\\z1\\test.zip","D:\\z2");
}
//压缩文件
public static void compression(String zipFileName, File targetFile){
System.out.println("正在压缩...");
try {
//要生成的压缩文件
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName));
BufferedOutputStream bos = new BufferedOutputStream(zos);
zip(zos,targetFile,targetFile.getName(),bos);
bos.close();
zos.close();
System.out.println("压缩完成...");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 递归压缩
*/
private static void zip(ZipOutputStream zos, File targetFile, String zipFileName, BufferedOutputStream bos) throws IOException {
if(targetFile.isDirectory()){
//如果是个目录就获取子目录,并且处理空目录
File[] files = targetFile.listFiles();
if(files.length == 0){//空文件夹
zos.putNextEntry(new ZipEntry(zipFileName+"/"));//处理空目录
}
for (File f:files){//递归处理
zip(zos,f,zipFileName+"/"+f.getName(),bos);
}
}else {
//不是目录的情况
zos.putNextEntry(new ZipEntry(zipFileName));
InputStream in = new FileInputStream(targetFile);
BufferedInputStream bis = new BufferedInputStream(in);
//开始读
byte[] bytes = new byte[1024];
int len = -1;
while ((len = bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
//关闭流
bis.close();
}
}
//解压
public static void deCompression(String targetFile,String parentPath){
try {
//构造解压的输入流
ZipInputStream zis = new ZipInputStream(new FileInputStream(targetFile));
ZipEntry entry = null;
//目标不为空且是一个文件
while ((entry = zis.getNextEntry())!=null && !entry.isDirectory()){
File file = new File(parentPath,entry.getName());
if(!file.exists()){
new File(file.getParent()).mkdir();//创建父文件夹,也就是此文件的上级目录
}
OutputStream out = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(out);
byte[] bytes = new byte[1024];
int len = -1;
while ((len = zis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
bos.close();
}
System.out.println("解压成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}