Java Zip 压缩、解压

原创 2016年06月02日 00:00:37
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Locale;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import android.text.TextUtils;

/**
 * zip压缩解压工具
 */
public class ZipUtils {
    private static final int BUFF_SIZE = 1024;

    /**
     * @param zos
     *            压缩流
     * @param parentDirName
     *            父目录
     * @param file
     *            待压缩文件
     * @param buffer
     *            缓冲区
     * @return 只要目录中有一个文件压缩失败,就停止并返回
     */
    private static boolean zipFile(ZipOutputStream zos, String parentDirName, File file, byte[] buffer) {
        String zipFilePath = parentDirName + file.getName();
        if (file.isDirectory()) {
            zipFilePath += File.separator;
            for (File f : file.listFiles()) {
                if (!zipFile(zos, zipFilePath, f, buffer)) {
                    return false;
                }
            }
            return true;
        } else {
            try {
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
                ZipEntry zipEntry = new ZipEntry(zipFilePath);
                zipEntry.setSize(file.length());
                zos.putNextEntry(zipEntry);
                int count;  
                while ((count = bis.read(buffer)) != -1) {  
                   zos.write(buffer, 0, count);  
                }
                bis.close();
                return true;
            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            return false;
        }
    }

    /**
     * @param srcPath
     *            待压缩的文件或目录
     * @param dstPath
     *            压缩后的zip文件
     * @return 只要待压缩的文件有一个压缩失败就停止压缩并返回(等价于windows上直接进行压缩)
     */
    public static boolean zipFile(String srcPath, String dstPath) {
        File srcFile = new File(srcPath);
        if (!srcFile.exists()) {
            return false;
        }
        byte[] buffer = new byte[BUFF_SIZE];
        try {
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dstPath));
            boolean result = zipFile(zos, "", srcFile, buffer);
            zos.close();
            return result;
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    /**
     * @param srcPath
     *            待解压的zip文件
     * @param dstPath
     *            zip解压后待存放的目录
     * @return 只要解压过程中发生错误,就立即停止并返回(等价于windows上直接进行解压)
     */
    public static boolean unzipFile(String srcPath, String dstPath) {
        if(TextUtils.isEmpty(srcPath) || TextUtils.isEmpty(dstPath)) {
            return false;
        }
        File srcFile = new File(srcPath);
        if(!srcFile.exists() || !srcFile.getName().toLowerCase(Locale.getDefault()).endsWith("zip")) {
            return false;
        }
        File dstFile = new File(dstPath);
        if(!dstFile.exists() || !dstFile.isDirectory()) {
            dstFile.mkdirs();
        }
        try {
            ZipInputStream zis = new ZipInputStream(new FileInputStream(srcFile));
            BufferedInputStream bis = new BufferedInputStream(zis);
            ZipEntry zipEntry = null;
            byte[] buffer = new byte[BUFF_SIZE];
            if(!dstPath.endsWith(File.separator)) {
                dstPath += File.separator;
            }
            while((zipEntry = zis.getNextEntry()) != null) {
                String fileName = dstPath + zipEntry.getName();
                File file = new File(fileName);
                File parentDir = file.getParentFile();
                if(!parentDir.exists()) {
                    parentDir.mkdirs();
                }
                FileOutputStream fos = new FileOutputStream(file);
                while(bis.read(buffer) != -1) {
                    fos.write(buffer);
                }
                fos.close();
            }
            bis.close();
            zis.close();
            return true;
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return false;
    }

}


感谢评论中的这位小哥指出这个问题

InputStream 的 read 方法会尽可能地填充满这个 buffer,同时返回当前填充的长度。

(1)当快到文件末尾的时候,可能只填充了部分 buffer,所以此时就需要按读取的实际长度来操作得到的这个 buffer 了

(2)当读到文件末尾的 EOF 标志的时候会返回 -1,可以通过这个特殊标志来结束循环。




版权声明:转载请注明出处——http://blog.csdn.net/chy555chy/article

java zip API实现压缩和解压缩zip包

package zip; import java.io.BufferedInputStream; import java.io.BufferedOutputStr...
  • carl_jiang
  • carl_jiang
  • 2017年04月24日 16:43
  • 4560

JAVA实现实用的ZIP压缩与解压

程序实现了ZIP压缩。共分为2部分 : 压缩(compression)与解压(decompression) 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和...
  • z69183787
  • z69183787
  • 2014年08月14日 11:10
  • 2715

java实现zip压缩和解压缩 源码

package zip; import java.io.*; import java.util.zip.*; /** * 将存放在sourceFilePath目录下的源文件,打包成fileNam...
  • jian51868
  • jian51868
  • 2014年12月02日 13:02
  • 3581

Java对字符串的压缩与解压

package com.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...
  • wq350778209
  • wq350778209
  • 2014年04月18日 15:34
  • 899

java zip API实现压缩和解压缩zip包

package zip; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.i...
  • stalwartwill
  • stalwartwill
  • 2013年12月17日 11:51
  • 40167

java 处理zip压缩/解压 文件/目录

环境操作系统: win7 java: jdk7需求需要把多个jar进行打包,方便上传。步骤这里我们需要用到的java api有:ZipOutputStream、ZipEntry。单个文件的压缩 ...
  • u013066244
  • u013066244
  • 2017年05月26日 16:42
  • 1113

Java实现文件的压缩与解压

在开发过程中,有时需要对用户上传的文件进行一个压缩操作,以节约硬盘空间,那么用Java怎么实现文件的压缩与解压呢?很简单,Java为我们提供了一个包,专门负责文件的压缩与解压的,那个包就是java.u...
  • qq969422014
  • qq969422014
  • 2015年05月08日 18:17
  • 5372

Linux中zip压缩和unzip解压缩命令详解

1、把/home目录下面的mydata目录压缩为mydata.zip zip -r mydata.zip mydata #压缩mydata目录 2、把/home目录下面的mydata.zip解压到my...
  • zmzwll1314
  • zmzwll1314
  • 2016年09月13日 11:34
  • 2732

java zip API实现压缩和解压缩zip包

package zip;      import java.io.BufferedInputStream;   import java.io.BufferedOutputStream;   i...
  • youyou_yo
  • youyou_yo
  • 2016年07月21日 10:04
  • 880

Linux中zip压缩和unzip解压缩命令详解

Linux中zip压缩和unzip解压缩命令详解1、把/home目录下面的mydata目录压缩为mydata.zip zip -r mydata.zip mydata #压缩mydata目录 2、...
  • a19860903
  • a19860903
  • 2015年07月01日 16:39
  • 11587
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java Zip 压缩、解压
举报原因:
原因补充:

(最多只允许输入30个字)