java实现zip压缩和解压工具
引入ant.jar
package com.develop.web.util; import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration; import org.apache.log4j.Logger;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream; public class ZipUtil {
private static int bufferSize = 2048;
private static Logger logger = Logger.getLogger(ZipUtil.class); /**
* 压缩
* @param srcFileOrDir 原文件或文件夹
* @param destZipFilePath 输出到的目标路径,默认zip文件为原文件或文件夹名称
*/
public static boolean zip(String srcFileOrDir, String destZipFilePath){
File file = new File(srcFileOrDir);
if(!file.exists()){
return false;
} String destZipFileName = file.getName(); return zip(srcFileOrDir, destZipFilePath, destZipFileName);
} /**
* 压缩
* @param srcFileOrDir 原文件或文件夹
* @param destZipFilePath 输出到的目标路径
* @param destZipFileName 生成的zip文件名称
*/
public static boolean zip(String srcFileOrDir, String destZipFilePath, String destZipFileName){
File file = new File(srcFileOrDir);
if(!file.exists()){
logger.info("原文件或文件夹不存在。");
return false;
} if(!destZipFilePath.endsWith(File.separator)){
destZipFilePath += File.separator;
} File destZipFileParentDir = new File(destZipFilePath);
if(!destZipFileParentDir.exists()){
destZipFileParentDir.mkdirs();
} if(!destZipFileName.endsWith(".zip")&&!destZipFileName.endsWith(".ZIP")){
destZipFileName += ".zip";
} boolean zipResult = false;
if(file.isFile()){
zipResult = zipFile(srcFileOrDir, destZipFilePath, destZipFileName);
}else if(file.isDirectory()){
zipResult = zipDir(srcFileOrDir, destZipFilePath, destZipFileName);
} logger.info("["+srcFileOrDir+"]-->["+destZipFilePath + destZipFileName+"]压缩结果:["+zipResult+"]"); return zipResult;
} private static boolean zipFile(String srcFileName, String destZipFilePath, String destZipFileName){
boolean zipResult = false;
File srcFile = new File(srcFileName); ZipOutputStream zipOutputStream = null;
try {
zipOutputStream = new ZipOutputStream(new FileOutputStream(destZipFilePath + destZipFileName));
zipOutputStream.setEncoding(System.getProperty("sun.jnu.encoding")); String fileName = srcFile.getName();
ZipEntry entry = new ZipEntry(fileName); BufferedInputStream bis = null;
try {
zipOutputStream.putNextEntry(entry);
bis = new BufferedInputStream(new FileInputStream(srcFile)); byte[] buf = new byte[bufferSize];
int len;
while ((len = bis.read(buf)) >= 0) {
zipOutputStream.flush();
zipOutputStream.write(buf, 0, len);
}
zipResult = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(zipOutputStream!=null){
zipOutputStream.closeEntry();
} if(bis!=null){
bis.close();
} } catch (IOException e) {
e.printStackTrace();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
if(zipOutputStream!=null){
zipOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} return zipResult;
} private static boolean zipDir(String srcDir, String destZipFilePath, String destZipFileName){
boolean zipResult = false;
if(!srcDir.endsWith(File.separator)){
srcDir += File.separator;
}
File srcFile = new File(srcDir);
File[] files = srcFile.listFiles(); ZipOutputStream zipOutputStream = null;
try {
zipOutputStream = new ZipOutputStream(new FileOutputStream(destZipFilePath + destZipFileName));
zipOutputStream.setEncoding(System.getProperty("sun.jnu.encoding"));
if(files!=null&&files.length>0){
for(File f :files){
compressFiles(f, f.getParent() ,zipOutputStream);
}
}
zipResult = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
if(zipOutputStream!=null){
zipOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return zipResult;
} private static void compressFiles(File file, String basePath, ZipOutputStream stream){
if(file==null||stream==null){
return;
}
if(file.isDirectory()){
ZipEntry entry = new ZipEntry(getEntryPath(file,basePath) + File.separator);
try {
stream.putNextEntry(entry);
} catch (IOException e) {
e.printStackTrace();
} File[] files = file.listFiles();
if(files!=null&&files.length>0){
for(File f :files){
compressFiles(f, basePath, stream);
}
}
}else{
String fileName = getEntryPath(file, basePath);
ZipEntry entry = new ZipEntry(fileName); BufferedInputStream bis = null;
try {
stream.putNextEntry(entry);
bis = new BufferedInputStream(new FileInputStream(file)); byte[] buf = new byte[bufferSize];
int len;
while ((len = bis.read(buf)) >= 0) {
stream.flush();
stream.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(stream!=null){
stream.closeEntry();
} if(bis!=null){
bis.close();
} } catch (IOException e) {
e.printStackTrace();
}
}
}
} private static String getEntryPath(File file, String basePath){
String path = file.getPath().substring(basePath.length() + 1);
return path;
} /**
* 解压
* @param srcZipFile 压缩文件
* @param destDir 目标路径
* @return
*/
public static boolean unzip(String srcZipFile, String destDir) {
boolean unzipResult = false;
ZipFile zipFile = null;
Enumeration<ZipEntry> entries = null;
try {
zipFile = new ZipFile(srcZipFile, System.getProperty("sun.jnu.encoding"));
if(zipFile!=null){
entries = zipFile.getEntries();
}
} catch (IOException e) {
e.printStackTrace();
} if(zipFile==null||entries == null){
logger.info("压缩文件不存在。");
return false;
} if(!destDir.endsWith(File.separator)){
destDir += File.separator;
} ZipEntry zipEntry = null;
while (entries.hasMoreElements()) {
zipEntry = entries.nextElement(); if (isDirectory(zipEntry)) {
try {
mkDirs(destDir + zipEntry.getName());
} catch (Exception e) {
e.printStackTrace();
} } else {
String name = zipEntry.getName();
File file = new File(destDir + name);
try {
mkDirs(file.getParent());
} catch (Exception e) {
e.printStackTrace();
} try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
} InputStream in = null;
FileOutputStream out = null;
try {
in = zipFile.getInputStream(zipEntry);
out = new FileOutputStream(file);
int c;
byte[] by = new byte[1024];
while ((c = in.read(by)) != -1) {
out.flush();
out.write(by, 0, c);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(out!=null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(in!=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
} unzipResult = true;
logger.info("["+srcZipFile+"]-->["+destDir+"]解压结果:["+unzipResult+"]"); try {
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
} return unzipResult;
} /**
* 重写判断zipEntry是否是文件夹,他的类方法【zipEntry.isDirectory()】是写死的"/",windows情况下会判断错误。
* @param zipEntry
* @return
*/
private static boolean isDirectory(ZipEntry zipEntry){
boolean isDirectory = false;
String name = zipEntry.getName();
if(name.endsWith(File.separator)){
isDirectory = true;
}
return isDirectory;
} private static void mkDirs(String dir){
if (dir == null || dir.equals("")){
return;
} File file = new File(dir);
if (!file.exists()){
file.mkdirs();
} } public static void main(String[] args) {
zip("D:\\test", "D:\\test1");
unzip("D:\\test1\\test.zip", "D:\\test1\\");
} }
java实现zip压缩和解压工具的更多相关文章
- Java 的zip压缩和解压缩
Java 的zip压缩和解压缩 好久没有来这写东西了,今天中秋节,有个东西想拿出来分享,一来是工作中遇到的问题,一来是和csdn问候一下,下面就分享一个Java中的zip压缩技术,代码实现比较简单,代 ...
- Java操作zip压缩和解压缩文件工具类
需要用到ant.jar(这里使用的是ant-1.6.5.jar) import java.io.File; import java.io.FileInputStream; import java.io ...
- Zip 压缩和解压技术在 HTML5 中的应用
JSZip 是一款可以创建.读取.修改 .zip 文件的 javaScript 工具.在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这 ...
- linux zip压缩和解压的各种操控
1.把/home文件夹以下的mydata文件夹压缩为mydata.zip zip -r mydata.zip mydata #压缩mydata文件夹 2.把/home文件夹以下的mydata.zip解 ...
- ZIP压缩和解压字符串
由于ZIP压缩会产生头信息, 所以当字符串长度没有达到一定规模的时候, 压缩后的长度可能比原来的还长 // 将一个字符串按照zip方式压缩和解压缩 public class ZipUtil { // ...
- 压缩和解压工具bandizip
同质化的压缩软件 提及 Windows 平台的压缩软件,大家往往想起老牌的 WinRAR.开源免费的 7-Zip.国产的快压.好压.360 压缩之类,甚至还有时代的眼泪 WinZip.一直以来,压缩软 ...
- ruby利用Zip Gem写一个简单的压缩和解压的小工具
在UNIX下的我们怎么会沦落到用ruby写压缩和解压工具呢?直接上shell啊!但是请允许本猫这次可耻的用ruby来玩玩吧!其实ruby GEM中有很多压缩解压包,我选的是Zip,也许是因为名字符合K ...
- 【转】Java压缩和解压文件工具类ZipUtil
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- java 压缩和解压zip包
网上有关压缩和解压zip包的博文一大堆,我随便找了一个.看了看,依照自己的须要改动了一下,与各位分享一下,希望各位大神指正: package com.wangpeng.utill; import ja ...
随机推荐
- PCB画板总结
最近几天完成了第一个PCB电路板.虽然器件不是很多,手动布线了4次才达到自己理想的效果. 但是还是有很多细节只有亲自拿到了自己做的板子,亲自焊接之后,才知道自己哪里不合适. 这是修改了4次之后的最终的 ...
- 原生 JavaScript 实现 state 状态管理系统
原生 JavaScript 实现 state 状态管理系统 Build a state management system with vanilla JavaScript | CSS-Tricks 在 ...
- python 中的 list dict 与 set 的关系
转自: http://www.cnblogs.com/soaringEveryday/p/5044007.html list arraylist 实现(数组) List 通过内置的 append()方 ...
- git 的相关知识
参考文章 git checkout HEAD <file> : master/HEAD -> index -> work directory index 暂存区有两行信息.分 ...
- windows服务安装 System.IO.FileLoadException
报错如下: System.IO.FileLoadException: 未能加载文件或程序集“file:///D:\WindowsService\bin\Debug\WindowsService.exe ...
- python中元组与数组的区别
列表: a=['12', '3rr'] 元组: t=(21,34) 列表可以修改,而元组不可以修改,如果元组中仅有一个元素,则要在元素后加上逗号. 元组和列表的查询方式一样. 元组只可读不可修改. 如 ...
- 带你开发一款给Apk中自动注入代码工具icodetools(完善篇)【申明:来源于网络】
带你开发一款给Apk中自动注入代码工具icodetools(完善篇)[申明:来源于网络] 带你开发一款给Apk中自动注入代码工具icodetools(完善篇):http://blog.csdn.net ...
- Spring Boot事务管理(中)
在上一篇 Spring Boot事务管理(上)的基础上介绍Spring Boot事务属性和事务回滚规则 . 4 Spring Boot事务属性 什么是事务属性呢?事务属性可以理解成事务的一些基本配置, ...
- array 和 alloc init 以及 new 区别
当你使用new.alloc或copy方法创建一个对象时,该对象的引用计数器值为1.当不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在其使用寿命结束 ...
- javaweb(1)之tomcat使用
安装 1.点击下载. 2.解压到一个目录. 3.进入解压后的 bin 目录,双击该文件夹下的 startup.bat 即可运行. 4.若运行成功,会有一个窗口悬停如下: 访问地址: localhost ...