使用java基础类实现zip压缩和zip解压工具类分享
本文导语: 使用java基础类写的一个简单的zip压缩解压工具类 代码如下:package sun.net.helper; import java.io.*;import java.util.logging.Logger;import java.util.zip.*;public class ZipUtil { private final static Logger logger = Logger.getLogger(ZipUtil.class.getName()); private ...
使用java基础类写的一个简单的zip压缩解压工具类
package sun.net.helper;
import java.io.*;
import java.util.logging.Logger;
import java.util.zip.*;
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){
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+"/"+source.getName()+".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 "+zipFile.getName());
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) {
if(file.isFile()){
FileInputStream fi= null;
BufferedInputStream origin=null;
try {
fi = new FileInputStream(file);
origin=new BufferedInputStream(fi, BUFFER);
int index=file.getAbsolutePath().indexOf(mainFileName);
String entryName=file.getAbsolutePath().substring(index);
System.out.println(entryName);
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()){
File[] fs=file.listFiles();
if(fs!=null&&fs.length>0){
for(File f:fs){
compress(f,out,mainFileName);
}
}
}
}
/**
* 将zip文件解压到指定的目录,该zip文件必须是使用该类的zip方法压缩的文件
* @param zipFile
* @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+"/"+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();
int index=entryName.indexOf(mainFileName);
String newEntryName=destPath+"/"+entryName.substring(index);
System.out.println(newEntryName);
File temp=new File(newEntryName).getParentFile();
if(!temp.exists()){
if(!temp.mkdirs()){
throw new RuntimeException("create file "+temp.getName() +" fail");
}
}
FileOutputStream fos = new FileOutputStream(newEntryName);
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 {
//ZipUtil.zip("D:/apache-tomcat-7.0.30", "d:/temp");
File zipFile=new File("D:/temp/apache-tomcat-7.0.30.zip");
ZipUtil.unzip(zipFile,"d:/temp") ;
}
}
另一个压缩解压示例,二个工具大家参考使用吧
package com.lanp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
/**
* 解压ZIP压缩文件到指定的目录
*/
public final class ZipToFile {
/**
* 缓存区大小默认20480
*/
private final static int FILE_BUFFER_SIZE = 20480;
private ZipToFile() {
}
/**
* 将指定目录的ZIP压缩文件解压到指定的目录
* @param zipFilePath ZIP压缩文件的路径
* @param zipFileName ZIP压缩文件名字
* @param targetFileDir ZIP压缩文件要解压到的目录
* @return flag 布尔返回值
*/
public static boolean unzip(String zipFilePath, String zipFileName, String targetFileDir){
boolean flag = false;
//1.判断压缩文件是否存在,以及里面的内容是否为空
File file = null; //压缩文件(带路径)
ZipFile zipFile = null;
file = new File(zipFilePath + "/" + zipFileName);
System.out.println(">>>>>>解压文件【" + zipFilePath + "/" + zipFileName + "】到【" + targetFileDir + "】目录下>>压缩文件【" + zipFilePath + "/" + zipFileName + "】不存在>>>压缩文件【" + zipFilePath + "/" + zipFileName + "】大小为0不需要解压>>>>>解压成功>>解压失败