`
haojinghua
  • 浏览: 51842 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
Unzip 用java实现的zip于unzip的功能
最近工作中总是做一件重复的事情,就是对一个zip文件进行解压缩,然后再根据某些配置文件,需要对zip包中的内容进行替换,然后还需要将解压后的文件再压缩,关于压缩和解压缩的方法很多,可以还是选择用java语言来实现这一功能,由于文件的数量比较多,而且又多数都是二进制文件,所以个人觉得不管是复制,还是解压缩,对文件的操作要求都是比较高的,进过再三的比较,最后选用了一位仁兄的推荐的程序,据说这段代码是出自ant.jar的source,具体关于zip和unzip的程序如下:

[java] view plaincopyprint?

    package com.eric.io;  
      
    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 org.apache.tools.zip.ZipEntry;  
    import org.apache.tools.zip.ZipFile;  
    import org.apache.tools.zip.ZipOutputStream;  
      
    public class Decompression {  
        private static final int BUFFEREDSIZE = 1024;  
      
        public Decompression() {  
        }  
      
        /** 
         * 解压zip格式的压缩文件到当前文件夹 
         *  
         * @param zipFileName 
         * @throws Exception 
         */  
        @SuppressWarnings("unchecked")  
        public synchronized void unzipFile(String zipFileName) throws Exception {  
            try {  
                File f = new File(zipFileName);  
                ZipFile zipFile = new ZipFile(zipFileName);  
                if ((!f.exists()) && (f.length() <= 0)) {  
                    throw new Exception("要解压的文件不存在!");  
                }  
                System.out.println(zipFileName + " was uncompressing....");  
                String strPath, gbkPath, strtemp;  
                File tempFile = new File(f.getParent());  
                strPath = tempFile.getAbsolutePath();  
                java.util.Enumeration e = zipFile.getEntries();  
                while (e.hasMoreElements()) {  
                    org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e  
                            .nextElement();  
                    gbkPath = zipEnt.getName();  
                    System.out.println("uncomress:" + zipEnt.getName());  
                    if (zipEnt.isDirectory()) {  
                        strtemp = strPath + "/" + gbkPath;  
                        File dir = new File(strtemp);  
                        dir.mkdirs();  
                        continue;  
                    } else {  
                        // 读写文件  
                        InputStream is = zipFile.getInputStream(zipEnt);  
                        BufferedInputStream bis = new BufferedInputStream(is);  
                        gbkPath = zipEnt.getName();  
                        strtemp = strPath + "/" + gbkPath;  
      
                        // 建目录  
                        String strsubdir = gbkPath;  
                        for (int i = 0; i < strsubdir.length(); i++) {  
                            if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {  
                                String temp = strPath + "/"  
                                        + strsubdir.substring(0, i);  
                                File subdir = new File(temp);  
                                if (!subdir.exists())  
                                    subdir.mkdir();  
                            }  
                        }  
                        FileOutputStream fos = new FileOutputStream(strtemp);  
                        BufferedOutputStream bos = new BufferedOutputStream(fos);  
                        int c;  
                        while ((c = bis.read()) != -1) {  
                            bos.write((byte) c);  
                        }  
                        bos.close();  
                        fos.close();  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
                throw e;  
            }  
        }  
      
        /** 
         * 解压zip格式的压缩文件到指定位置 
         *  
         * @param zipFileName 
         *            压缩文件 
         * @param extPlace 
         *            解压目录 
         * @throws Exception 
         */  
        @SuppressWarnings("unchecked")  
        public synchronized void unzip(String zipFileName, String extPlace)  
                throws Exception {  
            try {  
                (new File(extPlace)).mkdirs();  
                File f = new File(zipFileName);  
                ZipFile zipFile = new ZipFile(zipFileName);  
                if ((!f.exists()) && (f.length() <= 0)) {  
                    throw new Exception("要解压的文件不存在!");  
                }  
                String strPath, gbkPath, strtemp;  
                File tempFile = new File(extPlace);  
                strPath = tempFile.getAbsolutePath();  
                java.util.Enumeration e = zipFile.getEntries();  
                while (e.hasMoreElements()) {  
                    org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e  
                            .nextElement();  
                    gbkPath = zipEnt.getName();  
                    if (zipEnt.isDirectory()) {  
                        strtemp = strPath + File.separator + gbkPath;  
                        File dir = new File(strtemp);  
                        dir.mkdirs();  
                        continue;  
                    } else {  
                        // 读写文件  
                        InputStream is = zipFile.getInputStream(zipEnt);  
                        BufferedInputStream bis = new BufferedInputStream(is);  
                        gbkPath = zipEnt.getName();  
                        strtemp = strPath + File.separator + gbkPath;  
      
                        // 建目录  
                        String strsubdir = gbkPath;  
                        for (int i = 0; i < strsubdir.length(); i++) {  
                            if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {  
                                String temp = strPath + File.separator  
                                        + strsubdir.substring(0, i);  
                                File subdir = new File(temp);  
                                if (!subdir.exists())  
                                    subdir.mkdir();  
                            }  
                        }  
                        FileOutputStream fos = new FileOutputStream(strtemp);  
                        BufferedOutputStream bos = new BufferedOutputStream(fos);  
                        int c;  
                        while ((c = bis.read()) != -1) {  
                            bos.write((byte) c);  
                        }  
                        bos.close();  
                        fos.close();  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
                throw e;  
            }  
        }  
      
        /** 
         * 压缩zip格式的压缩文件 
         *  
         * @param inputFilename 
         *            压缩的文件或文件夹及详细路径 
         * @param zipFilename 
         *            输出文件名称及详细路径 
         * @throws IOException 
         */  
        public synchronized void zip(String inputFilename, String zipFilename)  
                throws IOException {  
            zip(new File(inputFilename), zipFilename);  
        }  
      
        /** 
         * 压缩zip格式的压缩文件 
         *  
         * @param inputFile 
         *            需压缩文件 
         * @param zipFilename 
         *            输出文件及详细路径 
         * @throws IOException 
         */  
        public synchronized void zip(File inputFile, String zipFilename)  
                throws IOException {  
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(  
                    zipFilename));  
            try {  
                zip(inputFile, out, "");  
                System.out.println(zipFilename + " was genrated successful....");  
            } catch (IOException e) {  
                throw e;  
            } finally {  
                out.close();  
            }  
        }  
      
        /** 
         * 压缩zip格式的压缩文件 
         *  
         * @param inputFile 
         *            需压缩文件 
         * @param out 
         *            输出压缩文件 
         * @param base 
         *            结束标识 
         * @throws IOException 
         */  
        @SuppressWarnings("unused")  
        private synchronized void zip(File inputFile, ZipOutputStream out,  
                String base) throws IOException {  
            System.out.println("compress " + inputFile + " ...");  
            if (inputFile.isDirectory()) {  
                File[] inputFiles = inputFile.listFiles();  
                out.putNextEntry(new ZipEntry(base + "/"));  
                base = base.length() == 0 ? "" : base + "/";  
                for (int i = 0; i < inputFiles.length; i++) {  
                    System.out.println("compress file:" + inputFiles[i].getName());  
                    zip(inputFiles[i], out, base + inputFiles[i].getName());  
                }  
            } else {  
                if (base.length() > 0) {  
                    out.putNextEntry(new ZipEntry(base));  
                } else {  
                    out.putNextEntry(new ZipEntry(inputFile.getName()));  
                }  
                FileInputStream in = new FileInputStream(inputFile);  
                try {  
                    int c;  
                    byte[] by = new byte[BUFFEREDSIZE];  
                    while ((c = in.read(by)) != -1) {  
                        out.write(by, 0, c);  
                    }  
                } catch (IOException e) {  
                    throw e;  
                } finally {  
                    in.close();  
                }  
            }  
        }  
      
        // public static void main(String[] args) {  
        // Decompression decompression = new Decompression();  
        // try {  
        // decompression.unzipFile("c:/test.zip");  
        // decompression.unzip("c:/test.zip", "c:/test22");  
        // decompression.zip("c:/test22", "c:/test222.zip");  
        // } catch (Exception e) {  
        // // TODO Auto-generated catch block  
        // e.printStackTrace();  
        // }  
        // }  
    }  
Global site tag (gtag.js) - Google Analytics