`

使用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);

    }

}
分享到:
评论

相关推荐

    commons-compress-1.18-bin jar包

    Apache Commons Compress库支持多种压缩和归档格式,如7z、AR、ARJ、BZip2、CPIO、DEFLATE、Gzip、LZMA、Pack200、RAR、SNappy、TAR、XZ、Z和ZIP等。这些格式广泛应用于数据存储、备份和传输。通过使用这个库,...

    Apache Commons Compress ( commons-compress-1.15-bin.zip)

    以下是使用Apache Commons Compress进行压缩和解压缩的基本步骤: **压缩文件示例**: ```java import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers...

    java源码:文件压缩解压缩包 Commons Compress.rar

    同时,Apache Commons Compress 还提供了与 Java 原生 IO 流的无缝集成,使得开发者可以轻松地将压缩操作集成到现有的数据处理流程中。 使用 Commons Compress 进行文件压缩和解压缩的基本步骤如下: 1. 引入库:...

    commons-compress-1.18-bin.zip

    这个库为开发者提供了简单易用的API,可以方便地进行tar包的压缩和解压缩操作。在本文中,我们将深入探讨`TarArchiveInputStream`、`TarArchiveOutputStream`和`TarArchiveEntry`这三个核心类的功能和使用方法。 ...

    commons-compress-1.18.jar【说明:Java、压缩库、压缩算法、解压缩、数据存储、压缩格式】

    3. 文件备份与恢复:在文件备份过程中,使用压缩功能可有效减小备份文件的大小,加快备份速度。 【其他说明】 1. 压缩格式支持:commons-compress-1.18.jar支持多种常见的压缩格式,如ZIP、GZIP、BZIP2等,适应不同...

    commons-compress-1.18.zip

    Commons Compress不仅提供基本的压缩和解压缩功能,还支持一些高级特性,如处理自解压文件(如Windows的自解压RAR文件),以及处理某些格式的特定属性,例如ZIP文件的密码保护或TAR文件的长路径名。 5. **与其他库...

    commons-compress-1.17-bin

    这在资源有限的Android设备上尤为重要,能够确保压缩和解压缩操作的流畅进行。 6. 安全性:库也考虑了安全性方面,比如防止路径遍历攻击,即通过构造恶意文件名来访问系统中的敏感文件。开发者在使用库时应遵循最佳...

    commons-compress

    commons-compress不仅支持基本的ZIP操作,还支持ZIP64(处理大文件)和一些扩展特性。 这个库的使用非常简单,只需导入相应的依赖,就可以方便地处理各种压缩格式,极大地简化了Java开发者的工作。它提供了一致的...

    commons-compress的一些应用

    在“commons-compress的一些应用”中,我们可以探讨如何利用这个库进行文件压缩和解压操作,以及其在实际项目中的应用。 首先,让我们从`TestCompress.java`这个文件名称推测,这可能是一个测试类,用于演示如何...

    基于Java的实例源码-文件压缩解压缩包 Commons Compress.zip

    这个压缩包“基于Java的实例源码-文件压缩解压缩包 Commons Compress.zip”包含了一些使用Apache Commons Compress库进行文件压缩和解压缩操作的示例代码。 Apache Commons Compress库支持多种压缩格式,如7z、AR、...

    common compress压缩源码

    以下是一个简单的使用Common Compress压缩和解压缩文件的例子: ```java import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream; import org.apache.commons.compress.compressors....

    基于java的文件压缩解压缩包 Commons Compress.zip

    现在我们详细探讨一下Apache Commons Compress库以及如何使用它进行文件的压缩和解压缩操作。 首先,Apache Commons Compress库的核心在于其提供了多种压缩算法的抽象,使得开发者可以方便地处理各种格式的压缩文件...

    基于Java的文件压缩解压缩包 Commons Compress.zip

    在本文中,我们将深入探讨如何使用Apache Commons Compress进行文件的压缩和解压缩。 首先,要使用Commons Compress库,我们需要将其添加到项目的依赖管理中。如果你的项目是Maven项目,可以在pom.xml文件中添加...

    基于java的开发源码-文件压缩解压缩包 Commons Compress.zip

    3. **文件和目录操作**:Apache Commons Compress不仅支持单个文件的压缩和解压缩,还可以处理整个目录。例如,通过`TarArchiveEntry`和`TarArchiveOutputStream`,可以将目录及其所有内容打包成一个TAR文件。 4. *...

    压缩解压所需jar包支持各种压缩格式

    在Java编程中,处理文件的压缩和解压缩操作通常是必要的,尤其是在大数据传输、存储优化和应用程序资源打包等方面。Apache Commons Compress库简化了这些任务,因为它提供了一个统一的API,开发者可以通过这个API来...

    zip压缩java工具类包含jar文件

    `commons-compress-1.18.jar`是该库的一个版本,包含了许多方便的API,可以帮助简化压缩和解压缩操作。例如,使用`Apache Commons Compress`库创建`zip`文件: ```java import org.apache.commons.compress....

    java zip文件压缩与解压缩

    总结来说,Java中使用Apache Commons Compress库进行ZIP文件操作,不仅提供了更丰富的功能,如设置字符编码,还能有效处理中文等非ASCII字符,保证了在处理多语言环境下的文件时不会出现乱码问题。通过上述方法,...

    apache-ant-compress-1.5-bin.zip

    "compress"目录下的"binaries"可能包含了用于压缩和解压缩操作的二进制文件,这些文件可能包含Java类库(.jar文件)和其他必要的资源,使得Ant能够执行文件的打包和解压操作。 在实际开发中,利用Ant Compress模块...

Global site tag (gtag.js) - Google Analytics