您的位置:首页 > 编程语言 > Java开发

使用Java解压ZIP文件

2008-06-04 17:50 351 查看
使用java来解压zip文件,org.apache.tools.zip可以解决压缩文件标题是中文的问题,使用多线程,提高效率

package com.proquest.magnolia.unzip;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.zip.ZipException;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

/* this class is for unpack the files in the zip file
* @author: zzy
* @time: June 3th,2008
*/
public class ZipUtils {
private static final List<ZipEntry> entries = new ArrayList<ZipEntry>();

/*
* the default constructor
*/
public ZipUtils() {
}

public static void unZipDirectory(String zipFileDirectory,
String outputDirectory) throws ZipException, IOException {
File file = new File(zipFileDirectory);
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].getName().endsWith(".zip")) {
unzip(zipFileDirectory + File.separator + files[i].getName(),
outputDirectory);
}
}
}

/*
* unzip the file to destination directory @param fileURI hold the file
* location @param outputDirectory hold the output directory of unpacked
* files @throws ZipException,IOException
*/
public static void unzip(String fileURI, String outputDirectory)
throws ZipException, IOException {
File file = new File(fileURI);
unzip(file, outputDirectory);
}

/*
* unzip the file to destination directory @param file hold the zip file
* @param outputDirectory hold the output directory of unpacked files
* @throws ZipException,IOException
*/
public static void unzip(File file, String outputDirectory)
throws ZipException, IOException {
ZipFile zipFile = new ZipFile(file);
Enumeration<ZipEntry> enu = (Enumeration<ZipEntry>) zipFile.getEntries();
while (enu.hasMoreElements()) {
ZipEntry entry = (ZipEntry) enu.nextElement();
if (entry.isDirectory()) {
String fileName = entry.getName().substring(0,
entry.getName().length() - 1);
String directoryPath = outputDirectory + File.separator
+ fileName;
File directory = new File(directoryPath);
directory.mkdir();
}
entries.add(entry);
}
unzip(zipFile, entries, outputDirectory);
}

public static void unzip(ZipFile zipFile, List<ZipEntry> entries,
String outputDirectory) throws IOException {
Iterator<ZipEntry> it = entries.iterator();
while (it.hasNext()) {
ZipEntry zipEntry = (ZipEntry) it.next();
MultiThreadEntry mte = new MultiThreadEntry(zipFile, zipEntry,
outputDirectory);

Thread thread = new Thread(mte);
thread.start();
}
}
/*
* Use MultiThread to read each entry
*/
private static class MultiThreadEntry implements Runnable {
public static final int BUFFER_SIZE = 2048;
private BufferedInputStream bis;
private ZipEntry zipEntry;
private String outputDirectory;

public MultiThreadEntry(ZipFile zipFile, ZipEntry zipEntry,
String outputDirectory) throws IOException {
this.zipEntry = zipEntry;
this.outputDirectory = outputDirectory;
bis = new BufferedInputStream(zipFile.getInputStream(zipEntry));
}

public void run() {
try {
unzipFiles(zipEntry, outputDirectory);
} catch (IOException e) {
try {
bis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
} finally {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

public void unzipFiles(ZipEntry zipEntry, String outputDirectory)
throws IOException {
byte[] data = new byte[BUFFER_SIZE];
String entryName = zipEntry.getName();
entryName = new String(entryName.getBytes("GBK"));
FileOutputStream fos = new FileOutputStream(outputDirectory
+ File.separator + entryName);
if (zipEntry.isDirectory()) {

} else {
BufferedOutputStream bos = new BufferedOutputStream(fos,
BUFFER_SIZE);
int count = 0;
while ((count = bis.read(data, 0, BUFFER_SIZE)) != -1) {
bos.write(data, 0, count);
}
bos.flush();
bos.close();
}
}
}

public static void main(String args[]) throws ZipException, IOException {
ZipUtils.unzip("C://test//test.zip", "C://test");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: