用org.apache.tools.zip压缩/解压缩zip文件

本文介绍了一个Java工具类,用于实现ZIP文件的压缩与解压功能。该工具类支持指定路径下的文件或文件夹的压缩,并能将ZIP文件解压到指定目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package org.coolyongzi;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;


public class ZipTools {
    public static final Logger logger = LogManager.getLogger(FileTools.class);
    public ZipTools()
    {
       
    }
    /*
     * @description:Compressed files or folders
     * @param compressedFilePath String,zipFileRootPath String,zipFileName String
     * @return boolean
     */
    public static boolean compressFloderChangeToZip(String compressedFilePath,String zipFileRootPath,String zipFileName)
    throws IOException
    {
        File compressedFile = new File(compressedFilePath);
        if("".equalsIgnoreCase(zipFileName))
        {
            zipFileName = StringTools.getShortFileNameFromFilePath(compressedFilePath);
        }
        if(!StringTools.conversionSpecialCharacters(zipFileRootPath).endsWith(File.separator))
        {
            zipFileRootPath = zipFileRootPath + File.separator;
        }
        ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFileRootPath + zipFileName));
        String base ="";
        logger.debug("compress [" + compressedFilePath + "] start!");
        boolean result = ZipTools.compressFloderChangeToZip(compressedFile,zipOutputStream,base);
        logger.debug("compress [" + compressedFilePath + "] end!");
        zipOutputStream.close();
        return result;
       
    }
   
    private static  boolean compressFloderChangeToZip(File compressedFile,ZipOutputStream zipOutputStream,String base)
    throws IOException
    {
        FileInputStream fileInputStream = null;
       
        try{
            if(compressedFile.isDirectory())
            {
                File[] childrenCompressedFileList = compressedFile.listFiles();
                base = base.length() == 0 ? "" : base + File.separator;
                for (int i = 0; i < childrenCompressedFileList.length; i++) {
                    ZipTools.compressFloderChangeToZip(childrenCompressedFileList[i],
                    zipOutputStream,base+childrenCompressedFileList[i].getName());
                }
            }
            else
            {
                if("".equalsIgnoreCase(base))
                {
                    base = compressedFile.getName();
                }
                zipOutputStream.putNextEntry(new ZipEntry(base));
                fileInputStream = new FileInputStream(compressedFile);
                int b;
                while((b=fileInputStream.read())!=-1)
                {
                    zipOutputStream.write(b);
                }
                fileInputStream.close();
            }
            return true;
        }catch(Exception e)
        {
            e.getStackTrace();
            logger.error(e.getMessage());
            return false;
        }
    }
    /*
     * @param:zipFilePath String,releasePath String
     * @return void
     * @description:Decompress A File
     */
    @SuppressWarnings("unchecked")
    public static void decompressFile(String zipFilePath,String releasePath) throws IOException
    {
        ZipFile zipFile = new ZipFile(zipFilePath);
        Enumeration<ZipEntry> enumeration = zipFile.getEntries();
        InputStream inputStream = null;
        FileOutputStream fileOutputStream = null;
        ZipEntry zipEntry = null;
        String zipEntryNameStr ="";
        String[] zipEntryNameArray = null;
        while (enumeration.hasMoreElements()) {
            zipEntry = enumeration.nextElement();
            zipEntryNameStr = zipEntry.getName();
            zipEntryNameArray = zipEntryNameStr.split("/");
            String path = releasePath;
            File root = new File(releasePath);
            if(!root.exists())
            {
                root.mkdir();
            }
            for (int i = 0; i < zipEntryNameArray.length; i++) {
                if(i<zipEntryNameArray.length-1)
                {
                    path = path + File.separator+zipEntryNameArray[i];       
                    new File(StringTools.conversionSpecialCharacters(path)).mkdir();
                }               
                else
                {
                    if(StringTools.conversionSpecialCharacters(zipEntryNameStr).endsWith(File.separator))
                    {
                        new File(releasePath + zipEntryNameStr).mkdir();
                    }
                    else
                    {
                        inputStream = zipFile.getInputStream(zipEntry);
                        fileOutputStream = new FileOutputStream(new File(
                                StringTools.conversionSpecialCharacters(releasePath + zipEntryNameStr)));   
                        byte[] buf = new byte[1024];
                        int len;
                        while ((len = inputStream.read(buf)) > 0)
                        {
                            fileOutputStream.write(buf, 0, len);
                        }
                        inputStream.close();
                        fileOutputStream.close();
                    }
                }
            }
        }
        zipFile.close();
    }
}





测试类

package org.coolyongzi.testcase;

import java.io.IOException;

import org.coolyongzi.ZipTools;

import junit.framework.TestCase;

public class ZipToolsTest extends TestCase {

    protected void setUp() throws Exception {
        super.setUp();
    }

    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public void testCompressFloderChangeToZip(){
        try {
            ZipTools.compressFloderChangeToZip("f:/iDocumentBanner2.gif", "f:", "test.zip");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
   
    public void testDecompressFile(){
        try {
            ZipTools.decompressFile("f:/java对解压Zip格式的文件.zip","f:/test/");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值