java对zip格式的文件压缩解压工具类

package org.easyelf.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.ArrayList;
import java.util.Enumeration;
import java.util.List;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
*功能:zip压缩、解压(支持中文文件名)
*说明:本程序通过使用Apache Ant里提供的zip工具org.apache.tools.zip实现了zip压缩和解压功能.
* 解决了由于java.util.zip包不支持汉字的问题。
* 使用java.util.zip包时,当zip文件中有名字为中文的文件时,
* 就会出现异常:"Exception in thread "main " java.lang.IllegalArgumentException
* at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
*注意:
* 1、使用时把ant.jar放到classpath中,程序中使用import org.apache.tools.zip.*;
* 2、Apache Ant 下载地址:[url]http://ant.apache.org/[/url]
* 3、Ant ZIP API:[url]http://www.jajakarta.org/ant/ant-1.6.1/docs/mix/manual/api/org/apache/tools/zip/[/url]
* 4、本程序使用Ant 1.7.1 中的ant.jar
*
*仅供编程学习参考.
*
*@author
*@date
*@Usage:
* 压缩:java AntZip -zip "directoryName"
* 解压:java AntZip -unzip "fileName.zip"
*/

public class ZipUtils{
private ZipFile zipFile;
private ZipOutputStream zipOut; //压缩Zip
private ZipEntry zipEntry;
private static int bufSize; //size of bytes
private byte[] buf;
private int readedBytes;
public ZipUtils(){
this(1024);
}

public ZipUtils(int bufSize){
this.bufSize = bufSize;
this.buf = new byte[this.bufSize];
}
/**
* 压缩文件夹内的文件
*
* @param unZipFile
* 需要解压的zip文件对象
* @param unZipFilePath 需要加压到指定的目录
* @throws IOException
*/
public void doZip(String filePath, String zipFilePath) {
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
File zipDir = new File(filePath);
String zipFileName = zipDir.getName() + ".zip";//压缩后生成的zip文件名
fos = new FileOutputStream(zipFilePath+zipFileName);
zos = new ZipOutputStream(fos);
handleDir(new File(filePath), zos, "");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (zos != null)
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fos != null)
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

//由doZip调用,递归完成目录文件读取
private void handleDir(File f, ZipOutputStream zos, String hiberarchy) throws IOException {
if (f.exists()) {
if (f.isDirectory()) {
hiberarchy += f.getName() + "/";
File[] fif = f.listFiles();
if(fif.length == 0){//如果目录为空,则单独创建之.
ZipEntry ze = new ZipEntry(hiberarchy);
zos.putNextEntry(ze);
}else{//如果目录不为空,则分别处理目录和文件.
for (int i = 0; i < fif.length; i++) {
handleDir(fif[i], zos, hiberarchy);
}
}
} else {
FileInputStream fis = null;
try {
fis = new FileInputStream(f);
ZipEntry ze = new ZipEntry(hiberarchy + f.getName());
zos.putNextEntry(ze);
while((this.readedBytes = fis.read(this.buf))>0){
zos.write(this.buf , 0 , this.readedBytes);
}
zos.closeEntry();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

}
/**
* 解压指定zip文件。
*
* @param unZipFile
* 需要解压的zip文件对象
* @param unZipFilePath 需要解压到指定的目录
*/
public void unZip(String unZipfileName,String unZipFilePath){//unZipfileName需要解压的zip文件名
FileOutputStream fileOut;
File file;
InputStream inputStream;

try{
this.zipFile = new ZipFile(unZipfileName);

for(Enumeration entries = this.zipFile.getEntries(); entries.hasMoreElements();){
ZipEntry entry = (ZipEntry)entries.nextElement();
file = new File(unZipFilePath+entry.getName());
if(entry.isDirectory()){
file.mkdirs();
}
else{
//如果指定文件的目录不存在,则创建之.
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();
}
}
this.zipFile.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}

//设置缓冲区大小
public void setBufSize(int bufSize){
this.bufSize = bufSize;
}
/**
* 把接受的全部文件打成压缩包
* @param List<File>;
* @param org.apache.tools.zip.ZipOutputStream
*/

public void zipFile
(List files,ZipOutputStream outputStream) {
int size = files.size();
for(int i = 0; i < size; i++) {
File file = (File) files.get(i);
zipFile(file, outputStream,"");
}
}
/**
* 根据输入的文件与输出流对文件进行打包
* @param File
* @param org.apache.tools.zip.ZipOutputStream
*/
public void zipFile(File inputFile,
ZipOutputStream ouputStream,String hiberarchy) {
try {
if(inputFile.exists()) {
/**如果是目录的话这里是不采取操作的,
* 至于目录的打包正在研究中*/
if (inputFile.isFile()) {
FileInputStream IN = new FileInputStream(inputFile);
BufferedInputStream bins = new BufferedInputStream(IN, 512);
//org.apache.tools.zip.ZipEntry
ZipEntry entry = new ZipEntry(inputFile.getName());
ouputStream.putNextEntry(entry);
// 向压缩文件中输出数据
while ((this.readedBytes = bins.read(this.buf)) != -1) {
ouputStream.write(this.buf, 0, this.readedBytes);
}
// 关闭创建的流对象
bins.close();
IN.close();
} else {
hiberarchy += inputFile.getName() + "/";
File[] fif = inputFile.listFiles();
if(fif.length == 0){//如果目录为空,则单独创建之.
ZipEntry ze = new ZipEntry(hiberarchy);
ouputStream.putNextEntry(ze);
}else{//如果目录不为空,则分别处理目录和文件.
for (int i = 0; i < fif.length; i++) {
handleDir(fif[i], ouputStream, hiberarchy);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

//测试AntZip类
public static void main(String[] args)throws Exception{
ZipUtils zip = new ZipUtils();
String name = "C:/Documents and Settings/Administrator/桌面/css.zip";
//
zip.unZip(name,"C:/Documents and Settings/Administrator/桌面/");
//String path = getRequest().getSession().getServletContext().getRealPath("/")+"/scripts/map/";
// zip.doZip("D:/zip解压","D:/");
// zip.doZip("D:/20130530154158_pgzw", "E:/");
/**这个集合就是你想要打包的所有文件,
* 这里假设已经准备好了所要打包的文件*/
// List<File> files = new ArrayList<File>();
// files.add(new File("D:\\wwgxpt\\wwgxpt\\WebRoot\\fujian\\"));
// files.add(new File("D:/20130518110527424_zwpg/20130518110527424_zwpg.xml"));
// /**创建一个临时压缩文件,
// * 我们会把文件流全部注入到这个文件中
// * 这里的文件你可以自定义是.rar还是.zip*/
// File file = new File("D:/certpics.zip");
// if (!file.exists()){
// file.createNewFile();
// }
// //创建文件输出流
// FileOutputStream fous = new FileOutputStream(file);
// /**打包的方法我们会用到ZipOutputStream这样一个输出流,
// * 所以这里我们把输出流转换一下*/
// ZipOutputStream zipOut
// = new ZipOutputStream(fous);
// /**这个方法接受的就是一个所要打包文件的集合,
// * 还有一个ZipOutputStream*/
// zip.zipFile(files, zipOut);
// zipOut.close();
// fous.close();

}
public void zipFiles(List files,List<String> fileName,ZipOutputStream outputStream) {
int size = files.size();
for(int i = 0; i < size; i++) {
File file = (File) files.get(i);
String filename = fileName.get(i);
zipFileReName(file,filename, outputStream,"");
}
}
public void zipFileReName(File inputFile,String fileName,
ZipOutputStream ouputStream,String hiberarchy) {
try {
if(inputFile.exists()) {
/**如果是目录的话这里是不采取操作的,
* 至于目录的打包正在研究中*/
if (inputFile.isFile()) {
FileInputStream IN = new FileInputStream(inputFile);
BufferedInputStream bins = new BufferedInputStream(IN, 512);
//org.apache.tools.zip.ZipEntry
ZipEntry entry = new ZipEntry(fileName);
ouputStream.putNextEntry(entry);
// 向压缩文件中输出数据
while ((this.readedBytes = bins.read(this.buf)) != -1) {
ouputStream.write(this.buf, 0, this.readedBytes);
}
// 关闭创建的流对象
bins.close();
IN.close();
} else {
hiberarchy += inputFile.getName() + "/";
File[] fif = inputFile.listFiles();
if(fif.length == 0){//如果目录为空,则单独创建之.
ZipEntry ze = new ZipEntry(hiberarchy);
ouputStream.putNextEntry(ze);
}else{//如果目录不为空,则分别处理目录和文件.
for (int i = 0; i < fif.length; i++) {
handleDir(fif[i], ouputStream, hiberarchy);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void doZipByFile(String path,List<String> listName,List<String> pathList){
ZipOutputStream zs = null;
FileOutputStream fileout = null;
List<File> list;
ZipUtils zu = new ZipUtils();
try {
File file = new File(path);
if (!file.exists()){
file.createNewFile();
}
fileout = new FileOutputStream(file);
zs= new ZipOutputStream(file);
list = new ArrayList<File>();
for (int i = 0; i < pathList.size(); i++) {
list.add(new File(pathList.get(i)));
}
zs.setEncoding("GBK");
zu.zipFiles(list,listName, zs);
fileout.close();
zs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

猜你喜欢

转载自blog.csdn.net/qq_26629277/article/details/78080937