首先我们实现最简单的解压缩zip文件,该zip文件中不包含文件夹,也不含中文名。
/**
* <pre>
* 参考:
* http://www.ibm.com/developerworks/cn/java/l-compress/index.html
* </pre>
*/
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class UnZip {
/** 定义一个2K的缓冲区 */
static final int BUFFER = 2048;
public static void main(String[] args) {
String fileName = "c:/testlog.zip";
// String unZipDir = "c:/abcd/abcd/abcd/abcd/abcd/";
String unZipDir = "c:/1/2/";
unZip(fileName, unZipDir);
// System.out.println(makeDir(unZipDir));
}
/**
* @param fileName
* String 待解压缩的文件名
* @param unZipDir
* String 存放解压缩后生成的文件的文件夹
*/
public static void unZip(String fileName, String unZipDir) {
try {
// 先判断目标文件夹是否存在,如果不存在则新建,如果父目录不存在也新建
File f = new File(unZipDir);
if (!f.exists()) {
f.mkdirs();
}
BufferedOutputStream dest = null;
// 将用文件输入流读入ZIP文件
FileInputStream fis = new FileInputStream(fileName);
// 类ZipInputStream读取ZIP文件
ZipInputStream zis = new ZipInputStream(
new BufferedInputStream(fis));
ZipEntry entry;
String newFileName = "";
// ZIP输入流打开后,你可以使用getNextEntry方法来读取ZIP文件中的条目数,
// 该方法返回一个ZipEntry对象。如果到达文件的尾部,getNextEntry返回null
while ((entry = zis.getNextEntry()) != null) {
System.out.println("Extracting: " + entry);
int count;
byte data[] = new byte[BUFFER];
// write the files to the disk
newFileName = unZipDir + "/" + entry.getName();
System.out.println("newFileName: " + newFileName);
FileOutputStream fos = new FileOutputStream(newFileName);
dest = new BufferedOutputStream(fos, BUFFER);
while ((count = zis.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
}
zis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean makeDir(String unZipDir) {
boolean b = false;
try {
File f = new File(unZipDir);
if (!f.exists()) {
b = f.mkdirs();
}
} catch (Exception e) {
e.printStackTrace();
return b;
}
return b;
}
}