前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java的 zip 工具类

java的 zip 工具类

原创
作者头像
用户7108768
修改2021-09-24 10:36:05
6760
修改2021-09-24 10:36:05
举报
代码语言:javascript
复制
import java.io.;
import java.util.logging.Logger;
import java.util.zip.;
/**

Created by sunyameng on 14-3-10.
/
public class ZipUtil {
 private final static Logger logger = Logger.getLogger(ZipUtil.class.getName());
 private static final int BUFFER = 1024  10;
 /**

将指定目录压缩到和该目录同名的zip文件,自定义压缩路径
*
@param sourceFilePath 目标文件路径
@param zipFilePath    指定zip文件路径
@return
*/
public static boolean zip(String sourceFilePath, String zipFilePath,String zipFileName) {
 boolean result = false;
 File source = new File(sourceFilePath);
 if (!source.exists()) {

 logger.info(sourceFilePath + " doesn't exist.");
 return result;
 
}
 if (!source.isDirectory()) {

 logger.info(sourceFilePath + " is not a directory.");
 return result;
 
}
 File zipFile = new File(zipFilePath + File.separator + zipFileName + ".zip");
 if (zipFile.exists()) {

 logger.info(zipFile.getName() + " is already exist.");
 return result;
 
} else {

 if (!zipFile.getParentFile().exists()) {
     if (!zipFile.getParentFile().mkdirs()) {
         logger.info("cann't create file " + zipFileName);
         return result;
     }
 }
 
}
 logger.info("creating zip file...");
 FileOutputStream dest = null;
 ZipOutputStream out = null;
 try {

 dest = new FileOutputStream(zipFile);
 CheckedOutputStream checksum = new CheckedOutputStream(dest, new Adler32());
 out = new ZipOutputStream(new BufferedOutputStream(checksum));
 out.setMethod(ZipOutputStream.DEFLATED);
 compress(source, out, source.getName());
 result = true;
 
} catch (FileNotFoundException e) {

 e.printStackTrace();
 
} finally {

 if (out != null) {
     try {
         out.closeEntry();
     } catch (IOException e) {
         e.printStackTrace();
     }
     try {
         out.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
 }
 
}
 if (result) {

 logger.info("done.");
 
} else {

 logger.info("fail.");
 
}
 return result;
}
private static void compress(File file, ZipOutputStream out, String mainFileName) {
 int index = file.getAbsolutePath().indexOf(mainFileName);
 String entryName = file.getAbsolutePath().substring(index);
 //System.out.println(entryName);
 if (file.isFile()) {

 FileInputStream fi = null;
 BufferedInputStream origin = null;
 try {
     fi = new FileInputStream(file);
     origin = new BufferedInputStream(fi, BUFFER);
     ZipEntry entry = new ZipEntry(entryName);
     out.putNextEntry(entry);
     byte[] data = new byte[BUFFER];
     int count;
     while ((count = origin.read(data, 0, BUFFER)) != -1) {
         out.write(data, 0, count);
     }
 } catch (FileNotFoundException e) {
     e.printStackTrace();
 } catch (IOException e) {
     e.printStackTrace();
 } finally {
     if (origin != null) {
         try {
             origin.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }
 
} else if (file.isDirectory()) {

 try {
     out.putNextEntry(new ZipEntry(entryName+File.separator));
 } catch (IOException e) {
     e.printStackTrace();
 }
 File[] fs = file.listFiles();
 if (fs != null && fs.length > 0) {
     for (File f : fs) {
         compress(f, out, mainFileName);
     }
 }
 
}
}
/**

将zip文件解压到指定的目录,该zip文件必须是使用该类的zip方法压缩的文件
*
@param zipFile   要解压的zip文件
@param destPath  指定解压到的目录
@return
*/
public static boolean unzip(File zipFile, String destPath) {
 boolean result = false;
 if (!zipFile.exists()) {

 logger.info(zipFile.getName() + " doesn't exist.");
 return result;
 
}
 File target = new File(destPath);
 if (!target.exists()) {

 if (!target.mkdirs()) {
     logger.info("cann't create file " + target.getName());
     return result;
 }
 
}
 String mainFileName = zipFile.getName().replace(".zip", "");
 File targetFile = new File(destPath + File.separator + mainFileName);
 if (targetFile.exists()) {

 logger.info(targetFile.getName() + " already exist.");
 return result;
 
}
 ZipInputStream zis = null;
 logger.info("start unzip file ...");
 try {

 FileInputStream fis = new FileInputStream(zipFile);
 CheckedInputStream checksum = new CheckedInputStream(fis, new Adler32());
 zis = new ZipInputStream(new BufferedInputStream(checksum));
 ZipEntry entry;
 while ((entry = zis.getNextEntry()) != null) {
     int count;
     byte data[] = new byte[BUFFER];
     String entryName = entry.getName();
     //logger.info(entryName);
     String newEntryName = destPath + File.separator + entryName;
     newEntryName=newEntryName.replaceAll("\\\\", "/");
     File f = new File(newEntryName);
     if(newEntryName.endsWith("/")){
         if(!f.exists()){
             if(!f.mkdirs()) {
                 throw new RuntimeException("can't create directory " + f.getName());
             }
         }
     }else{
         File temp=f.getParentFile();
         if (!temp.exists()) {
             if (!temp.mkdirs()) {
                 throw new RuntimeException("create file " + temp.getName() + " fail");
             }
         }
         FileOutputStream fos = new FileOutputStream(f);
         BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);
         while ((count = zis.read(data, 0, BUFFER)) != -1) {
             dest.write(data, 0, count);
         }
         dest.flush();
         dest.close();
     }
 }
 result = true;
 
} catch (FileNotFoundException e) {

 e.printStackTrace();
 
} catch (IOException e) {

 e.printStackTrace();
 
} finally {

 if (zis != null) {
     try {
         zis.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
 }
 
}
 if (result) {

 logger.info("done.");
 
} else {

 logger.info("fail.");
 
}
 return result;
}
public static void main(String[] args) throws IOException {
//        String path="D:\temp\B";
//        ZipUtil.zip(path,"d:/temp/c","anhuigs123");
 String zipfile ="D:\temp\c\B.zip";
 File zipFile = new File(zipfile);
 String output="D:\temp\c";
 ZipUtil.unzip(zipFile, output);
}
}




</pre> 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com