原文:http://www.open-open.com/code/view/1430906539866

package com.topsoft.websites.utils;

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);
}
}

java zip 工具类的更多相关文章

  1. java zip工具类

    依赖jar :apache-ant-1.9.2-bin.zip import java.io.File; import java.io.FileInputStream; import java.io. ...

  2. java常用工具类(二)

    1.FtpUtil package com.itjh.javaUtil; import java.io.File; import java.io.FileOutputStream; import ja ...

  3. Java Properties工具类详解

    1.Java Properties工具类位于java.util.Properties,该工具类的使用极其简单方便.首先该类是继承自 Hashtable<Object,Object> 这就奠 ...

  4. Java json工具类,jackson工具类,ObjectMapper工具类

    Java json工具类,jackson工具类,ObjectMapper工具类 >>>>>>>>>>>>>>> ...

  5. Java日期工具类,Java时间工具类,Java时间格式化

    Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>&g ...

  6. Java并发工具类 - CountDownLatch

    Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...

  7. MinerUtil.java 爬虫工具类

    MinerUtil.java 爬虫工具类 package com.iteye.injavawetrust.miner; import java.io.File; import java.io.File ...

  8. MinerDB.java 数据库工具类

    MinerDB.java 数据库工具类 package com.iteye.injavawetrust.miner; import java.sql.Connection; import java.s ...

  9. 小记Java时间工具类

    小记Java时间工具类 废话不多说,这里主要记录以下几个工具 两个时间只差(Data) 获取时间的格式 格式化时间 返回String 两个时间只差(String) 获取两个时间之间的日期.月份.年份 ...

随机推荐

  1. CF895E Eyes Closed (期望)

    题目链接 利用期望的线性性质: \(E(sum) = E(x_l) + E(x_{l+1})+ E(x_{l+2}) +.. E(x_r)\) 然后就考虑对于交换时两个区间元素的改动. 假设这两个区间 ...

  2. [LUOGU] P2679 子串

    一开始用一个f数组转移,发现不太对,状态有重叠部分 f[i][j][k]表示考虑了s的前i位,匹配到t的第j位,用了k个子串,且s的第i位必选 g[i][j][k]表示考虑了s的前i位,匹配到t的第j ...

  3. [HIHO] 1050 树中的最长路

    #1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...

  4. memory bist lib

    model NVIC_REG6T_1024x32(resetb,margin,clk,en,we,addr,d,q) ( bist_definition( clock clk high; chip_e ...

  5. Android开发——Activity启动模式详解

    1. Activity的启动模式 本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52054893 1.1 Standard标 ...

  6. SQL server游标基本结构

    简单游标遍历数据: BEGIN DECLARE QZ_cursor CURSOR SCROLL FOR /*创建游标*/ SELECT NAME FROM USERINFO/*要遍历的数据*/ OPE ...

  7. centos 7 smplayer vlc播放器

    centos7安装多媒体播放器SMPlayer 2017-03-13 21:37:14 分类: LINUX 转自:https://wiki.centos.org/TipsAndTricks/Multi ...

  8. php 修改

    <?php$id = $_GET['id'];$db = new mysqli("localhost","root","root",& ...

  9. ASP.NET(五):ASP.net实现真分页显示数据

    导读:在上篇文章中,介绍了用假分页实现数据的分页显示 ,而避免了去拖动滚动条.但,假分页在分页的同时,其实是拖垮了查询效率的.每一次分页都得重新查询一遍数据,那么有没有方法可以同时兼顾效率和分页呢,那 ...

  10. bzoj1853: [Scoi2010]幸运数字 dp+容斥原理

    在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是 ...