java压缩/解压缩zip格式文件

java压缩/解压缩zip格式文件

     因为项目要用到压缩、解压缩zip格式压缩包,只好自己封装一个,对于网上流行的中文乱码的问题,本文的解决方法是用apache的包代替jdk里的。基本上还是比较好用的。

    废话少说,直接上代码。

复制代码
  1 package  com.resoft.util;
  2
  3 import  java.io.BufferedOutputStream;
  4 import  java.io.File;
  5 import  java.io.FileInputStream;
  6 import  java.io.FileNotFoundException;
  7 import  java.io.FileOutputStream;
  8 import  java.io.IOException;
  9 import  java.io.InputStream;
 10 import  java.io.OutputStream;
 11 import  java.util.Enumeration;
 12
 13 import  org.apache.tools.zip.ZipEntry;
 14 import  org.apache.tools.zip.ZipFile;
 15 import  org.apache.tools.zip.ZipOutputStream;
 16
 17 /**
 18 * 压缩/解压缩zip包处理类
 19 * 
 20 * @author yayagepei
 21 * @date 2008-8-25
 22 */

 23 public   class  ZipUtil  {
 24
 25    /**
 26     * 压缩
 27     * 
 28     * @param zipFileName
 29     *            压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名
 30     * @param relativePath
 31     *            相对路径,默认为空
 32     * @param directory
 33     *            文件或目录的绝对路径
 34     * @throws FileNotFoundException
 35     * @throws IOException
 36     * @author yayagepei
 37     * @date 2008-8-26
 38     */

 39    public static void zip(String zipFileName, String relativePath,
 40            String directory) throws FileNotFoundException, IOException {
 41        String fileName = zipFileName;
 42        if (fileName == null || fileName.trim().equals("")) {
 43            File temp = new File(directory);
 44            if (temp.isDirectory()) {
 45                fileName = directory + ".zip";
 46            }
 else {
 47                if (directory.indexOf("."> 0{
 48                    fileName = directory.substring(0, directory
 49                            .lastIndexOf("."))
 50                            + "zip";
 51                }
 else {
 52                    fileName = directory + ".zip";
 53                }

 54            }

 55        }

 56        ZipOutputStream zos = new ZipOutputStream(
 57                new FileOutputStream(fileName));
 58        try {
 59            zip(zos, relativePath, directory);
 60        }
 catch (IOException ex) {
 61            throw ex;
 62        }
 finally {
 63            if (null != zos) {
 64                zos.close();
 65            }

 66        }

 67    }

 68
 69    /**
 70     * 压缩
 71     * 
 72     * @param zos
 73     *            压缩输出流
 74     * @param relativePath
 75     *            相对路径
 76     * @param absolutPath
 77     *            文件或文件夹绝对路径
 78     * @throws IOException
 79     * @author yayagepei
 80     * @date 2008-8-26
 81     */

 82    private static void zip(ZipOutputStream zos, String relativePath,
 83            String absolutPath) throws IOException {
 84        File file = new File(absolutPath);
 85        if (file.isDirectory()) {
 86            File[] files = file.listFiles();
 87            for (int i = 0; i < files.length; i++{
 88                File tempFile = files[i];
 89                if (tempFile.isDirectory()) {
 90                    String newRelativePath = relativePath + tempFile.getName()
 91                            + File.separator;
 92                    createZipNode(zos, newRelativePath);
 93                    zip(zos, newRelativePath, tempFile.getPath());
 94                }
 else {
 95                    zipFile(zos, tempFile, relativePath);
 96                }

 97            }

 98        }
 else {
 99            zipFile(zos, file, relativePath);
100        }

101    }

102
103    /**
104     * 压缩文件
105     * 
106     * @param zos
107     *            压缩输出流
108     * @param file
109     *            文件对象
110     * @param relativePath
111     *            相对路径
112     * @throws IOException
113     * @author yayagepei
114     * @date 2008-8-26
115     */

116    private static void zipFile(ZipOutputStream zos, File file,
117            String relativePath) throws IOException {
118        ZipEntry entry = new ZipEntry(relativePath + file.getName());
119        zos.putNextEntry(entry);
120        InputStream is = null;
121        try {
122            is = new FileInputStream(file);
123            int BUFFERSIZE = 2 << 10;
124            int length = 0;
125            byte[] buffer = new byte[BUFFERSIZE];
126            while ((length = is.read(buffer, 0, BUFFERSIZE)) >= 0{
127                zos.write(buffer, 0, length);
128            }

129            zos.flush();
130            zos.closeEntry();
131        }
 catch (IOException ex) {
132            throw ex;
133        }
 finally {
134            if (null != is) {
135                is.close();
136            }

137        }

138    }

139
140    /**
141     * 创建目录
142     * 
143     * @param zos
144     *            zip输出流
145     * @param relativePath
146     *            相对路径
147     * @throws IOException
148     * @author yayagepei
149     * @date 2008-8-26
150     */

151    private static void createZipNode(ZipOutputStream zos, String relativePath)
152            throws IOException {
153        ZipEntry zipEntry = new ZipEntry(relativePath);
154        zos.putNextEntry(zipEntry);
155        zos.closeEntry();
156    }

157
158    /**
159     * 解压缩zip包
160     * 
161     * @param zipFilePath
162     *            zip文件路径
163     * @param targetPath
164     *            解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下
165     * @throws IOException
166     * @author yayagepei
167     * @date 2008-9-28
168     */

169    public static void unzip(String zipFilePath, String targetPath)
170            throws IOException {
171        OutputStream os = null;
172        InputStream is = null;
173        ZipFile zipFile = null;
174        try {
175            zipFile = new ZipFile(zipFilePath);
176            String directoryPath = "";
177            if (null == targetPath || "".equals(targetPath)) {
178                directoryPath = zipFilePath.substring(0, zipFilePath
179                        .lastIndexOf("."));
180            }
 else {
181                directoryPath = targetPath;
182            }

183            Enumeration entryEnum = zipFile.getEntries();
184            if (null != entryEnum) {
185                ZipEntry zipEntry = null;
186                while (entryEnum.hasMoreElements()) {
187                    zipEntry = (ZipEntry) entryEnum.nextElement();
188                    if (zipEntry.isDirectory()) {
189                        directoryPath = directoryPath + File.separator
190                                + zipEntry.getName();
191                        System.out.println(directoryPath);
192                        continue;
193                    }

194                    if (zipEntry.getSize() > 0{
195                        // 文件
196                        File targetFile = FileUtil.buildFile(directoryPath
197                                + File.separator + zipEntry.getName(), false);
198                        os = new BufferedOutputStream(new FileOutputStream(
199                                targetFile));
200                        is = zipFile.getInputStream(zipEntry);
201                        byte[] buffer = new byte[4096];
202                        int readLen = 0;
203                        while ((readLen = is.read(buffer, 04096)) >= 0{
204                            os.write(buffer, 0, readLen);
205                        }

206
207                        os.flush();
208                        os.close();
209                    }
 else {
210                        // 空目录
211                        FileUtil.buildFile(directoryPath + File.separator
212                                + zipEntry.getName(), true);
213                    }

214                }

215            }

216        }
 catch (IOException ex) {
217            throw ex;
218        }
 finally {
219            if(null != zipFile){
220                zipFile = null;
221            }

222            if (null != is) {
223                is.close();
224            }

225            if (null != os) {
226                os.close();
227            }

228        }

229    }

230}

231

 

 补充一下里面用到的一个自己写的FileUtil的一个方法

/**
     * 生产文件 如果文件所在路径不存在则生成路径
     * 
     * @param fileName
     *            文件名 带路径
     * @param isDirectory 是否为路径
     * @return
     * @author yayagepei
     * @date 2008-8-27
     */
    public static File buildFile(String fileName, boolean isDirectory) {
        File target = new File(fileName);
        if (isDirectory) {
            target.mkdirs();
        } else {
            if (!target.getParentFile().exists()) {
                target.getParentFile().mkdirs();
                target = new File(target.getAbsolutePath());
            }
        }
        return target;
    } 

复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值