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");
- }
- }