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 java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
/**
* Description: 请注意,如果在你压缩的时候请选择zip格式压结缩,再用此程序读取,不要用rar格式压缩后再改成zip,不然会报错.
*
* @author Bong(2009-9-23)
* @version 1.0.0
*/
public class ZipTest {
/**
* 此方法用于压缩文件包括所有的子目录
*
* @param directory
* 需要压缩文件入径
* @param zipNam
* 设置压缩文件名称
*/
public static void createZip(File directory, String zipNam) {
try {
// 创建zip输出流
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipNam));
tree("", directory, out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 此方法用于递归压缩文件
*
* @param directory
* ZIP文件条目的文件夹名称
* @param f
* 需要压缩文件目录中文件
* @param out
* ZIP输出流,用于压缩文件
*/
public static void tree(String directory, File f, ZipOutputStream out) {
try {
File[] ar = f.listFiles();
for (File i : ar) {
// 判断是否是文件夹,如果是就递归
if (i.isDirectory()) {
tree(i.getName() + "/", i, out);
continue;
}
String zipEntryName = directory + i.getName();
ZipEntry entry = new ZipEntry(zipEntryName);
// 创建一个ZipEntry,并设置Name和其它的一些属性
entry.setSize(i.length());
entry.setTime(i.lastModified());
// 将ZipEntry加到out中,再写入实际的文件内容
out.putNextEntry(entry);
FileInputStream fin = new FileInputStream(i);
// 复制数据
int b;
byte[] buff = new byte[1024];
while ((b = fin.read(buff)) != -1) {
out.write(buff);
}
fin.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
* @param zipFile
* 解压文件入径
* @param directory
* 解压文件存放入径
*/
public static void decompress(File zipFile, File directory) {
try {
ZipFile zin = new ZipFile(zipFile);
InputStream in = null;
FileOutputStream out = null;
// 返回 ZIP 文件条目的枚举,进行循环
Enumeration<? extends ZipEntry> e = zin.entries();
while (e.hasMoreElements()) {
ZipEntry entry = e.nextElement();
// 判断ZIP 文件条目是否是目录条目(也就是是否是目录)
if (entry.isDirectory()) { // 如果是就创建此目录,因为在解压过程中,不会自动创建目录
File f = new File(directory.getAbsoluteFile()+ "/" + entry.getName());
f.mkdir(); // 创建此抽象路径名指定的目录
continue; // 因为是目录所以就不必往下执行了
}
in = zin.getInputStream(entry); // 读取文件条目数据
out = new FileOutputStream(new File(directory, entry.getName()));
// 复制数据
int b;
byte[] buff = new byte[1024];
while ((b = in.read(buff)) != -1) {
out.write(buff);
}
out.flush();
out.close();
}
// 关闭流
zin.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
try {
// createZip(new File("D:\\javaa"), "D:\\abc.zip");
//decompress(new File("D:\\abc.zip"), new File("D:\\abc"));
} catch (Exception e) {
e.printStackTrace();
}
}
}