使用commons-compress操作zip文件(压缩和解压缩)





  Apache Commons Compress是一个压缩、解压缩文件的类库。

  可以操作ar, cpio, Unix dump, tar, zip, gzip, XZ, Pack200 and bzip2格式的文件,功能比较强大。

  在这里写两个用Commons Compress把文件压缩成zip和从zip解压缩的方法。

  直接贴上工具类代码:







package rockecsn.jaker;



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 org.apache.commons.compress.archivers.ArchiveEntry;

import org.apache.commons.compress.archivers.zip.Zip64Mode;

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;

import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;

import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;





/**

* Zip文件工具类

* @author jaker

*/

public class ZipFileUtil {

    

    /**

     * 把文件压缩成zip格式

     * @param files         需要压缩的文件

     * @param zipFilePath 压缩后的zip文件路径   ,如"D:/test/aa.zip";

     */

    public static void compressFiles2Zip(File[] files,String zipFilePath) {

        if(files != null && files.length >0) {

            if(isEndsWithZip(zipFilePath)) {

                ZipArchiveOutputStream zaos = null;

                try {

                    File zipFile = new File(zipFilePath);

                    zaos = new ZipArchiveOutputStream(zipFile);

                    //Use Zip64 extensions for all entries where they are required

                    zaos.setUseZip64(Zip64Mode.AsNeeded);

                    

                    //将每个文件用ZipArchiveEntry封装

                    //再用ZipArchiveOutputStream写到压缩文件中

                    for(File file : files) {

                        if(file != null) {

                            ZipArchiveEntry zipArchiveEntry  = new ZipArchiveEntry(file,file.getName());

                            zaos.putArchiveEntry(zipArchiveEntry);

                            InputStream is = null;

                            try {

                                is = new BufferedInputStream(new FileInputStream(file));

                                byte[] buffer = new byte[1024 * 5]; 

                                int len = -1;

                                while((len = is.read(buffer)) != -1) {

                                    //把缓冲区的字节写入到ZipArchiveEntry

                                    zaos.write(buffer, 0, len);

                                }

                                //Writes all necessary data for this entry.

                                zaos.closeArchiveEntry(); 

                            }catch(Exception e) {

                                throw new RuntimeException(e);

                            }finally {

                                if(is != null)

                                    is.close();

                            }

                            

                        }

                    }

                    zaos.finish();

                }catch(Exception e){

                    throw new RuntimeException(e);

                }finally {

                        try {

                            if(zaos != null) {

                                zaos.close();

                            }

                        } catch (IOException e) {

                            throw new RuntimeException(e);

                        }

                }

                

            }

            

        }

        

    }

    

    /**

     * 把zip文件解压到指定的文件夹

     * @param zipFilePath   zip文件路径, 如 "D:/test/aa.zip"

     * @param saveFileDir   解压后的文件存放路径, 如"D:/test/"

     */

    public static void decompressZip(String zipFilePath,String saveFileDir) {

        if(isEndsWithZip(zipFilePath)) {

            File file = new File(zipFilePath);

            if(file.exists()) {

                InputStream is = null;

                //can read Zip archives

                ZipArchiveInputStream zais = null;

                try {

                    is = new FileInputStream(file);

                    zais = new ZipArchiveInputStream(is);

                    ArchiveEntry  archiveEntry = null;

                    //把zip包中的每个文件读取出来

                    //然后把文件写到指定的文件夹

                    while((archiveEntry = zais.getNextEntry()) != null) {

                        //获取文件名

                        String entryFileName = archiveEntry.getName();

                        //构造解压出来的文件存放路径

                        String entryFilePath = saveFileDir + entryFileName;

                        byte[] content = new byte[(int) archiveEntry.getSize()];

                        zais.read(content);

                        OutputStream os = null;

                        try {

                            //把解压出来的文件写到指定路径

                            File entryFile = new File(entryFilePath);

                            os = new BufferedOutputStream(new FileOutputStream(entryFile));

                            os.write(content);

                        }catch(IOException e) {

                            throw new IOException(e);

                        }finally {

                            if(os != null) {

                                os.flush();

                                os.close();

                            }

                        }

                        

                    }

                }catch(Exception e) {

                    throw new RuntimeException(e);

                }finally {

                        try {

                            if(zais != null) {

                                zais.close();

                            }

                            if(is != null) {

                                is.close();

                            }

                        } catch (IOException e) {

                            throw new RuntimeException(e);

                        }

                }

            }

        }

    }

    

    /**

     * 判断文件名是否以.zip为后缀

     * @param fileName        需要判断的文件名

     * @return 是zip文件返回true,否则返回false

     */

    public static boolean isEndsWithZip(String fileName) {

        boolean flag = false;

        if(fileName != null && !"".equals(fileName.trim())) {

            if(fileName.endsWith(".ZIP")||fileName.endsWith(".zip")){

                flag = true;

            }

        }

        return flag;

    }

    

}


  再来测试一下:


package rockecsn.jaker;



import java.io.File;



import org.junit.Test;



import cn.luxh.utils.ZipFileUtil;



/**

* 测试ZipFileUtil的压缩和解压缩方法

* @author jaker

*/

public class ZipFileUtilTest {

    

    @Test

    public void testCompressFiles2Zip() {

        //存放待压缩文件的目录

        File srcFile = new File("D:/test");

        //压缩后的zip文件路径

        String zipFilePath = "d:/test2/test.zip";

        if(srcFile.exists()) {

            File[] files = srcFile.listFiles();

            ZipFileUtil.compressFiles2Zip(files, zipFilePath);

        }

    }

    

    @Test

    public void testDecompressZip()  {

        //压缩包所在路径

        String zipFilePath = "d:/test2/test.zip";

        //解压后的文件存放目录

        String saveFileDir = "d:/test2/";

        //调用解压方法

        ZipFileUtil.decompressZip(zipFilePath, saveFileDir);

    }

}

猜你喜欢

转载自rockecsn.iteye.com/blog/1581944