java.util.zip包实现了zip格式相关的类库,使用ZIP格式压缩和解压缩文件时可以使用该包中的类,但是对于解压缩中文文件名,就会出现乱码,所以可以使用ant中的org.apache.tools.zip包中的类进行解压缩,使用方法和java中的类似
使用ZipoOutputStream可以实现文件压缩,所有写入到ZipOutputStream输出流中的数据,都会被Zip格式压缩。
每个压缩的文件或目录在ZIP文件中对应一个ZipEntry对象,每个ZipEntry都有一个name属性,表示它相对于Zip文件根目录的相对路径,对于目录,路径以‘/’结束,对应文件,路径以文件名结尾。
ZipOutputStream的putNextEntry方法忘Zip文件中添加一个ZipEntry,紧接着写入到该ZipOutputStream流中的数据都被保存在这个ZipEntry中,直到调用ZipOutputStream的closeEntry方法。
ZipFile表示一个Zip文件,它的entries方法能获取Zip文件中所有的ZipEntry集合。
ZipEntry的isDirectory方法判断该ZipEntry是否代表一个目录。getInputStream方法获取ZipEntry的输入流
package com.lkt.zip;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
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压缩和解压文件或目录
* @author Administrator
*
*/
public class ZipTest {
public static void zipFile(String baseDirName,String fileName,String targetFileName){
if(baseDirName==null){
System.out.println("压缩失败,根目录不存在:"+baseDirName);
return ;
}
File baseDir=new File(baseDirName);
if(!baseDir.exists()||(!baseDir.isDirectory())){
System.out.println("压缩失败,根目录不存在:"+baseDirName);
return ;
}
String baseDirPath=baseDir.getPath();
System.out.println(baseDirPath);
//目标文件
File targetFile=new File(targetFileName);
try {
//创建一个zip输出流来压缩数据并写入到zip文件
ZipOutputStream out=new ZipOutputStream(new FileOutputStream(targetFile));
if(fileName.equals("*")){
dirToZip(baseDirPath, baseDir, out);
}else{
File file=new File(baseDir,fileName);
if(file.isFile()){
fileToZip(baseDirPath, file, out);
}else{
dirToZip(baseDirPath, file, out);
}
}
out.close();
System.out.println("压缩文件成功,目标文件名:"+targetFileName);
} catch (Exception e) {
// TODO: handle exception
}
}
/**
* 解压ZIP文件,将ZIP文件的内容解压到targetDir目录下
* @param zipFileName
* @param targetBaseDirName
*/
public static void upzipFile(String zipFileName,String targetBaseDirName){
if(!targetBaseDirName.endsWith(File.separator)){
targetBaseDirName+=File.separator;
}
try {
//根据ZIP文件创建zipfile对象
ZipFile zipFile=new ZipFile(zipFileName);
ZipEntry entry=null;
String entryName=null;
String targetFileName=null;
byte[] buffer=new byte[4096];
int bytes_read;
//获取ZIP文件里所有的entry
Enumeration entrys=zipFile.getEntries();
while(entrys.hasMoreElements()){
entry=(ZipEntry)entrys.nextElement();
entryName=entry.getName();
targetFileName=targetBaseDirName+entryName;
if(entry.isDirectory()){
new File(targetFileName).mkdirs();
continue;
}else{
new File(targetFileName).getParentFile().mkdirs();
}
File targetFile=new File(targetFileName);
System.out.println("创建文件:"+targetFile.getAbsolutePath());
FileOutputStream os=new FileOutputStream(targetFile);
InputStream is=zipFile.getInputStream(entry);
while((bytes_read=is.read(buffer))!=-1){
os.write(buffer, 0, bytes_read);
}
os.close();
is.close();
}
System.out.println("解压缩文件成功");
} catch (Exception e) {
System.out.println("解压缩文件失败");
}
}
/**
* 将目录压缩到ZIP输出流
* @param baseDirPath
* @param dir
* @param out
*/
private static void dirToZip(String baseDirPath,File dir,ZipOutputStream out){
if(dir.isDirectory()){
File[] files=dir.listFiles();
if(files.length==0){
ZipEntry entry=new ZipEntry(getEntryName(baseDirPath, dir));
try {
out.putNextEntry(entry);
out.closeEntry();
} catch (Exception e) {
}
return ;
}
for (int i = 0; i < files.length; i++) {
if(files[i].isFile()){
fileToZip(baseDirPath, files[i], out);
}else{
dirToZip(baseDirPath, files[i], out);
}
}
}
}
//将文件压缩到ZIP输出流
private static void fileToZip(String baseDirPath,File file,ZipOutputStream out){
FileInputStream in=null;
ZipEntry entry=null;
//创建复制缓冲区
byte[] buffer=new byte[4096];
int bytes_read;
if(file.isFile()){
try {
//创建一个文件输入流
in =new FileInputStream(file);
entry=new ZipEntry(getEntryName(baseDirPath, file));
//存储项信息到压缩文件
out.putNextEntry(entry);
//复制字节到压缩文件
while((bytes_read=in.read(buffer))!=-1){
out.write(buffer, 0, bytes_read);
}
out.closeEntry();
in.close();
System.out.println("添加文件:"+file.getAbsolutePath()+"被添加到ZIP文件中");
} catch (Exception e) {
e.printStackTrace();
}
}
}
//获取待压缩文件在ZIP文件中的entry的名字,即相对于根目录的相对路径名
private static String getEntryName(String baseDirPath,File file){
if(!baseDirPath.endsWith(File.separator)){
baseDirPath+=File.separator;
}
String filePath=file.getAbsolutePath();
if(file.isDirectory()){
filePath+="/";
}
int index=filePath.indexOf(baseDirPath);
return filePath.substring(index+baseDirPath.length());
}
public static void main(String[] args) {
String baseDirName="E:";
String fileName="工作图片/";
String zipFileName="E:\\工作图片.zip";
ZipTest.zipFile(baseDirName, fileName, zipFileName);
//ZipTest.upzipFile("F:\\学习资料\\Python\\hibernate-release-4.2.4.Final.zip", "F:\\学习资料\\Python\\hibernate4.2.4");
}
}