package com.unionread.dqd.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
*功能:zip压缩、解压(支持中文文件名)
*
*仅供编程学习参考.
*/
public class AntZip{
private static int bufSize; //size of bytes
private byte[] buf;
private int readedBytes;
public AntZip(){
this(512);
}
public AntZip(int bufSize){
this.bufSize = bufSize;
this.buf = new byte[this.bufSize];
}
//压缩文件夹内的文件
public void doZip(String zipDirectory,String outFile){//zipDirectoryPath:需要压缩的文件夹名
File zipDir = new File(zipDirectory);
try{
ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(outFile)));
zipOut.setEncoding("GBK");
handleDir(zipDir ,"", zipOut);
zipOut.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
//由doZip调用,递归完成目录文件读取
private void handleDir(File dir , String base, ZipOutputStream zipOut)throws IOException{
FileInputStream fileIn;
File[] files;
if(dir.isDirectory()){
System.out.println(dir.getName());
files = dir.listFiles();
if(files.length == 0){//如果目录为空,则单独创建之.
//ZipEntry的isDirectory()方法中,目录以"/"结尾.
zipOut.putNextEntry(new ZipEntry(base + File.separator));
zipOut.closeEntry();
}else{//如果目录不为空,则分别处理目录和文件.
base = base.length() == 0 ? "" : base + File.separator;
for(File fileName : files){
handleDir(fileName , base+fileName.getName() ,zipOut);
}
}
}else{
fileIn = new FileInputStream(dir);
zipOut.putNextEntry(new ZipEntry(base));
while((this.readedBytes = fileIn.read(this.buf))>0){
zipOut.write(this.buf , 0 , this.readedBytes);
}
fileIn.close();
zipOut.closeEntry();
}
}
//解压指定zip文件
@SuppressWarnings("unchecked")
public void unZip(String unZipfileName,String outDir){//unZipfileName需要解压的zip文件名
FileOutputStream fileOut;
File file;
InputStream inputStream;
try{
ZipFile zipFile = new ZipFile(unZipfileName, "GBK");
for(Enumeration<ZipEntry> entries = zipFile.getEntries(); entries.hasMoreElements();){
ZipEntry entry = (ZipEntry)entries.nextElement();
if(entry.isDirectory()){
file = new File(outDir+File.separator+entry.getName());
file.mkdirs();
}else{
file = new File(outDir+File.separator+entry.getName());
File parent = file.getParentFile();
if(!parent.exists())parent.mkdirs();
inputStream = zipFile.getInputStream(entry);
fileOut = new FileOutputStream(file);
while(( this.readedBytes = inputStream.read(this.buf) ) > 0){
fileOut.write(this.buf , 0 , this.readedBytes );
}
fileOut.close();
inputStream.close();
}
}
zipFile.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
//设置缓冲区大小
public void setBufSize(int bufSize){
this.bufSize = bufSize;
}
//测试AntZip类
public static void main(String[] args)throws Exception{
AntZip zip = new AntZip();
// zip.doZip("D:/package/temp","D:/package/destination/test.zip");
zip.unZip("D:/package/destination/test.zip","D:/package/temp/dir");
}
}
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
*功能:zip压缩、解压(支持中文文件名)
*
*仅供编程学习参考.
*/
public class AntZip{
private static int bufSize; //size of bytes
private byte[] buf;
private int readedBytes;
public AntZip(){
this(512);
}
public AntZip(int bufSize){
this.bufSize = bufSize;
this.buf = new byte[this.bufSize];
}
//压缩文件夹内的文件
public void doZip(String zipDirectory,String outFile){//zipDirectoryPath:需要压缩的文件夹名
File zipDir = new File(zipDirectory);
try{
ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(outFile)));
zipOut.setEncoding("GBK");
handleDir(zipDir ,"", zipOut);
zipOut.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
//由doZip调用,递归完成目录文件读取
private void handleDir(File dir , String base, ZipOutputStream zipOut)throws IOException{
FileInputStream fileIn;
File[] files;
if(dir.isDirectory()){
System.out.println(dir.getName());
files = dir.listFiles();
if(files.length == 0){//如果目录为空,则单独创建之.
//ZipEntry的isDirectory()方法中,目录以"/"结尾.
zipOut.putNextEntry(new ZipEntry(base + File.separator));
zipOut.closeEntry();
}else{//如果目录不为空,则分别处理目录和文件.
base = base.length() == 0 ? "" : base + File.separator;
for(File fileName : files){
handleDir(fileName , base+fileName.getName() ,zipOut);
}
}
}else{
fileIn = new FileInputStream(dir);
zipOut.putNextEntry(new ZipEntry(base));
while((this.readedBytes = fileIn.read(this.buf))>0){
zipOut.write(this.buf , 0 , this.readedBytes);
}
fileIn.close();
zipOut.closeEntry();
}
}
//解压指定zip文件
@SuppressWarnings("unchecked")
public void unZip(String unZipfileName,String outDir){//unZipfileName需要解压的zip文件名
FileOutputStream fileOut;
File file;
InputStream inputStream;
try{
ZipFile zipFile = new ZipFile(unZipfileName, "GBK");
for(Enumeration<ZipEntry> entries = zipFile.getEntries(); entries.hasMoreElements();){
ZipEntry entry = (ZipEntry)entries.nextElement();
if(entry.isDirectory()){
file = new File(outDir+File.separator+entry.getName());
file.mkdirs();
}else{
file = new File(outDir+File.separator+entry.getName());
File parent = file.getParentFile();
if(!parent.exists())parent.mkdirs();
inputStream = zipFile.getInputStream(entry);
fileOut = new FileOutputStream(file);
while(( this.readedBytes = inputStream.read(this.buf) ) > 0){
fileOut.write(this.buf , 0 , this.readedBytes );
}
fileOut.close();
inputStream.close();
}
}
zipFile.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
//设置缓冲区大小
public void setBufSize(int bufSize){
this.bufSize = bufSize;
}
//测试AntZip类
public static void main(String[] args)throws Exception{
AntZip zip = new AntZip();
// zip.doZip("D:/package/temp","D:/package/destination/test.zip");
zip.unZip("D:/package/destination/test.zip","D:/package/temp/dir");
}
}