压缩与解压:
public class Zip {
private static Logger log = Logger.getLogger(Zip.class.toString());
/**
* 根据地址获得Zip文件
* @param firstDir------源文件路径(即要压缩的文件地址)----d:\\example
* @param aimDir--------目标文件路径(即要压缩到什么地方)---d:\\exmaple.zip
*/
public static void getZip(String firstDir, String aimDir) {
setZip(firstDir, aimDir);
}
/**
* 创建压缩文件所需要的对象
* @param firstDir--同上
* @param aimDir
*/
private static void setZip(String firstDir, String aimDir) {
File file1 = new File(aimDir);
File file2 = new File(firstDir);
if(!file2.exists()) {
log.info("要压缩的文件不存在=>" + firstDir);
return;
}
try(ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(file1)))){
log.info("压缩文件中......");
Zip(file2, zos, "");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
log.info("压缩完成!");
}
}
/**
* 压缩文件
* @param firstdir-----文件的起始位置的File对象
* @param zos----------文件的目的位置的ZipOutputStream对象
* @param basedir------文件 相对 起始文件 的位置(初始为"")
* @throws IOException
*/
private static void Zip(File firstdir, ZipOutputStream zos, String basedir) throws IOException{
if(!firstdir.exists()){
return;
}
//如果是文件
if(firstdir.isFile()) {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(firstdir));
zos.putNextEntry(new ZipEntry(basedir+firstdir.getName()));
//复制文件的内容
byte[] bs = new byte[2048];
int temp = 0;
while((temp = bis.read(bs)) != -1) {
zos.write(temp);
}
bis.close();
return;
}
//如果是目录
else if(firstdir.isDirectory()) {
//将目录中的文件存放到list中
File[] list = firstdir.listFiles();
//存在空文件夹时创建
if(list.length == 0) {
zos.putNextEntry(new ZipEntry(basedir+firstdir.getName()+File.separator));
}
//递归文件夹中的文件
for(File file:list) {
Zip(file, zos, basedir+firstdir.getName()+File.separator);
}
}
}
/**
* 解压文件
* @param zipPath-----源文件路径----D:\\mood.zip
* @param descDir-----目标文件路径----D:\\
* @return 解压是否成功
*/
@SuppressWarnings("rawtypes")
public static boolean decompressZip(String zipPath, String descDir) {
File zipFile = new File(zipPath);
boolean flag = false;
File pathFile = new File(descDir);
if(!pathFile.exists()){
pathFile.mkdirs();
}
//防止中文目录,乱码
try(ZipFile zip = new ZipFile(zipFile, Charset.forName("gbk"))) {
for(Enumeration entries = zip.entries(); entries.hasMoreElements();){
ZipEntry entry = (ZipEntry)entries.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
//指定解压后的文件夹+当前zip文件的名称
String outPath = (descDir+zipEntryName).replace("/", File.separator);
//判断路径是否存在,不存在则创建文件路径
File file = new File(outPath.substring(0, outPath.lastIndexOf(File.separator)));
if(!file.exists()){
file.mkdirs();
}
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if(new File(outPath).isDirectory()){
continue;
}
//保存文件路径信息(可利用md5.zip名称的唯一性,来判断是否已经解压)
//log.info("当前zip解压之后的路径为:" + outPath);
OutputStream out = new FileOutputStream(outPath);
byte[] buf1 = new byte[2048];
int len;
while((len=in.read(buf1))>0){
out.write(buf1,0,len);
}
in.close();
out.close();
}
flag = true;
//必须关闭,要不然这个zip文件一直被占用着,要删删不掉,改名也不可以,移动也不行,整多了,系统还崩了。
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
}