读书人

JAVA兑现压缩/解压缩zip文件

发布时间: 2012-12-27 10:17:09 作者: rapoo

JAVA实现压缩/解压缩zip文件

1.import java.io.BufferedInputStream;   2.import java.io.BufferedOutputStream;   3.import java.io.File;   4.import java.io.FileInputStream;   5.import java.io.FileOutputStream;   6.import java.io.IOException;   7.import java.io.InputStream;   8.import java.io.OutputStream;   9.import java.util.ArrayList;   10.import java.util.Enumeration;   11.import java.util.List;   12.import java.util.zip.ZipEntry;   13.import java.util.zip.ZipFile;   14.import java.util.zip.ZipOutputStream;   15.  16.public class ZipToFile {   17.       18.    public static final String ZIP_FILENAME = "C:\\XJPDA.zip";//需要解压缩的文件名   19.    public static final String ZIP_DIR = "C:\\XJPDA\\";//需要压缩的文件夹   20.    public static final String UN_ZIP_DIR = "C:\\";//要解压的文件目录   21.    public static final int BUFFER = 1024 ;//缓存大小   22.       23.    /**  24.    * zip压缩功能.  25.    * 压缩baseDir(文件夹目录)下所有文件,包括子目录  26.    * @throws Exception  27.    */  28.    public static void zipFile(String baseDir,String fileName) throws Exception{   29.        List fileList=getSubFiles(new File(baseDir));   30.        ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));   31.        ZipEntry ze=null;   32.        byte[] buf=new byte[BUFFER];   33.        int readLen=0;   34.        for(int i = 0; i <fileList.size(); i++) {   35.            File f=(File)fileList.get(i);   36.            ze=new ZipEntry(getAbsFileName(baseDir, f));   37.            ze.setSize(f.length());   38.            ze.setTime(f.lastModified());      39.            zos.putNextEntry(ze);   40.            InputStream is=new BufferedInputStream(new FileInputStream(f));   41.            while ((readLen=is.read(buf, 0, BUFFER))!=-1) {   42.                zos.write(buf, 0, readLen);   43.            }   44.            is.close();   45.        }   46.        zos.close();   47.    }   48.       49.    /**  50.    * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.  51.    * @param baseDir java.lang.String 根目录  52.    * @param realFileName java.io.File 实际的文件名  53.    * @return 相对文件名  54.    */  55.    private static String getAbsFileName(String baseDir, File realFileName){   56.        File real=realFileName;   57.        File base=new File(baseDir);   58.        String ret=real.getName();   59.        while (true) {   60.            real=real.getParentFile();   61.            if(real==null)    62.                break;   63.            if(real.equals(base))    64.                break;   65.            else  66.                ret=real.getName()+"/"+ret;   67.        }   68.        return ret;   69.    }   70.       71.    /**  72.    * 取得指定目录下的所有文件列表,包括子目录.  73.    * @param baseDir File 指定的目录  74.    * @return 包含java.io.File的List  75.    */  76.    private static List getSubFiles(File baseDir){   77.        List ret=new ArrayList();   78.        File[] tmp=baseDir.listFiles();   79.        for (int i = 0; i <tmp.length; i++) {   80.            if(tmp[i].isFile())   81.                ret.add(tmp[i]);   82.            if(tmp[i].isDirectory())   83.                ret.addAll(getSubFiles(tmp[i]));   84.        }   85.        return ret;   86.    }   87.       88.    /**  89.    * 解压缩功能.  90.    * 将ZIP_FILENAME文件解压到ZIP_DIR目录下.  91.    * @throws Exception  92.    */  93.    public static void upZipFile() throws Exception{   94.        ZipFile zfile=new ZipFile(ZIP_FILENAME);   95.        Enumeration zList=zfile.entries();   96.        ZipEntry ze=null;   97.        byte[] buf=new byte[1024];   98.        while(zList.hasMoreElements()){   99.            ze=(ZipEntry)zList.nextElement();          100.            if(ze.isDirectory()){   101.                File f=new File(ZIP_DIR+ze.getName());   102.                f.mkdir();   103.                continue;   104.            }   105.            OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));   106.            InputStream is=new BufferedInputStream(zfile.getInputStream(ze));   107.            int readLen=0;   108.            while ((readLen=is.read(buf, 0, 1024))!=-1) {   109.                os.write(buf, 0, readLen);   110.            }   111.            is.close();   112.            os.close();    113.        }   114.        zfile.close();   115.    }   116.  117.    /**  118.    * 给定根目录,返回一个相对路径所对应的实际文件名.  119.    * @param baseDir 指定根目录  120.    * @param absFileName 相对路径名,来自于ZipEntry中的name  121.    * @return java.io.File 实际的文件  122.    */  123.    public static File getRealFileName(String baseDir, String absFileName){   124.        String[] dirs=absFileName.split("/");   125.        File ret=new File(baseDir);   126.        if(dirs.length>1){   127.            for (int i = 0; i < dirs.length-1;i++) {   128.                ret=new File(ret, dirs[i]);   129.            }   130.            if(!ret.exists())   131.                ret.mkdirs();   132.            ret=new File(ret, dirs[dirs.length-1]);   133.            return ret;   134.        }   135.        return ret;   136.    }   137.  138.}  import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;public class ZipToFile {public static final String ZIP_FILENAME= "C:\\XJPDA.zip";//需要解压缩的文件名public static final String ZIP_DIR = "C:\\XJPDA\\";//需要压缩的文件夹public static final String UN_ZIP_DIR = "C:\\";//要解压的文件目录public static final int BUFFER = 1024 ;//缓存大小/*** zip压缩功能.* 压缩baseDir(文件夹目录)下所有文件,包括子目录* @throws Exception*/public static void zipFile(String baseDir,String fileName) throws Exception{List fileList=getSubFiles(new File(baseDir));ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));ZipEntry ze=null;byte[] buf=new byte[BUFFER];int readLen=0;for(int i = 0; i <fileList.size(); i++) {File f=(File)fileList.get(i);ze=new ZipEntry(getAbsFileName(baseDir, f));ze.setSize(f.length());ze.setTime(f.lastModified());zos.putNextEntry(ze);InputStream is=new BufferedInputStream(new FileInputStream(f));while ((readLen=is.read(buf, 0, BUFFER))!=-1) {zos.write(buf, 0, readLen);}is.close();}zos.close();}/*** 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.* @param baseDir java.lang.String 根目录* @param realFileName java.io.File 实际的文件名* @return 相对文件名*/private static String getAbsFileName(String baseDir, File realFileName){File real=realFileName;File base=new File(baseDir);String ret=real.getName();while (true) {real=real.getParentFile();if(real==null) break;if(real.equals(base)) break;elseret=real.getName()+"/"+ret;}return ret;}/*** 取得指定目录下的所有文件列表,包括子目录.* @param baseDir File 指定的目录* @return 包含java.io.File的List*/private static List getSubFiles(File baseDir){List ret=new ArrayList();File[] tmp=baseDir.listFiles();for (int i = 0; i <tmp.length; i++) {if(tmp[i].isFile())ret.add(tmp[i]);if(tmp[i].isDirectory())ret.addAll(getSubFiles(tmp[i]));}return ret;}/*** 解压缩功能.* 将ZIP_FILENAME文件解压到ZIP_DIR目录下.* @throws Exception*/public static void upZipFile() throws Exception{ZipFile zfile=new ZipFile(ZIP_FILENAME);Enumeration zList=zfile.entries();ZipEntry ze=null;byte[] buf=new byte[1024];while(zList.hasMoreElements()){ze=(ZipEntry)zList.nextElement();if(ze.isDirectory()){            File f=new File(ZIP_DIR+ze.getName());            f.mkdir();continue;}OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));InputStream is=new BufferedInputStream(zfile.getInputStream(ze));int readLen=0;while ((readLen=is.read(buf, 0, 1024))!=-1) {os.write(buf, 0, readLen);}is.close();os.close();}zfile.close();}/*** 给定根目录,返回一个相对路径所对应的实际文件名.* @param baseDir 指定根目录* @param absFileName 相对路径名,来自于ZipEntry中的name* @return java.io.File 实际的文件*/public static File getRealFileName(String baseDir, String absFileName){String[] dirs=absFileName.split("/");File ret=new File(baseDir);if(dirs.length>1){for (int i = 0; i < dirs.length-1;i++) {ret=new File(ret, dirs[i]);}if(!ret.exists())ret.mkdirs();ret=new File(ret, dirs[dirs.length-1]);return ret;}return ret;}}

不过上面存在中文问题
是因为java.util.zip下的格式转换有问题

import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
改成
import org.apache.tools.zip.*;
即可!
apache里修正了这一现象。
原文地址:http://orz.iteye.com/blog/110842

读书人网 >编程

热点推荐