Java.util.zip 压缩与解压缩工具类

Java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。

还包括使用 DEFLATE 压缩算法(用于 ZIP 和 GZIP 文件格式)对数据进行压缩和解压缩的类。

依赖 Jdk 编写该工具类,不依赖任何第三方 jar,随用随取,实现功能大体如下:

1.目录级别递归压缩与解压缩 zip;

2.单文件压缩和解压缩 zip ;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 * 通过Java的Zip输入输出流实现压缩和解压文件
 */
public final class ZipUtil {

    private ZipUtil() {

    }

    /**
     * 压缩文件
     *
     * @param filePath 待压缩的文件路径
     * @return 压缩后的文件
     */
    public static File zip(String filePath) {
        File target = null;
        File source = new File(filePath);
        if (source.exists()) {
            String sourceName = source.getName();
            String zipName = sourceName.contains(".") ? sourceName.substring(0, sourceName.indexOf(".")) : sourceName;
            target = new File(source.getParent(), zipName + ".rar");
            if (target.exists()) {
                boolean delete = target.delete();//删除旧的压缩包
            }
            FileOutputStream fos = null;
            ZipOutputStream zos = null;
            try {
                fos = new FileOutputStream(target);
                zos = new ZipOutputStream(new BufferedOutputStream(fos));

                addEntry(null, source, zos);  //添加对应的文件Entry
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                IOUtil.closeQuietly(zos, fos);
            }
        }
        return target;
    }

    /**
     * 扫描添加文件Entry
     *
     * @param base   基路径
     * @param source 源文件
     * @param zos    Zip文件输出流
     * @throws IOException
     */
    private static void addEntry(String base, File source, ZipOutputStream zos) throws IOException {
        String entry = (base != null) ? base + source.getName() : source.getName(); //按目录分级,形如:aaa/bbb.txt
        if (source.isDirectory()) {
            File[] files = source.listFiles();
            if (files != null && files.length > 0) {
                for (File file : files) {
                    addEntry(entry + "/", file, zos);// 递归列出目录下的所有文件,添加文件 Entry
                }
            }
        } else {
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                byte[] buffer = new byte[1024 * 10];
                fis = new FileInputStream(source);
                bis = new BufferedInputStream(fis, buffer.length);
                int read;
                zos.putNextEntry(new ZipEntry(entry)); //如果只是想将文件夹下的所有文件压缩,不需名要压缩父目录,约定文件名长度 entry.substring(length)
                while ((read = bis.read(buffer, 0, buffer.length)) != -1) {
                    zos.write(buffer, 0, read);
                }
                zos.closeEntry();
            } finally {
                IOUtil.closeQuietly(bis, fis);
            }
        }
    }

    /**
     * 解压文件
     *
     * @param filePath 压缩文件路径
     */
    public static void unzip(String filePath) {
        File source = new File(filePath);
        if (source.exists()) {
            ZipInputStream zis = null;
            BufferedOutputStream bos = null;
            try {
                zis = new ZipInputStream(new FileInputStream(source));
                ZipEntry entry;
                while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) {
                    File target = new File(source.getParent(), entry.getName());
                    if (!target.getParentFile().exists()) {
                        target.getParentFile().mkdirs();
                    }
                    bos = new BufferedOutputStream(new FileOutputStream(target));
                    int read;
                    byte[] buffer = new byte[1024 * 10];
                    while ((read = zis.read(buffer, 0, buffer.length)) != -1) {
                        bos.write(buffer, 0, read);
                    }
                    bos.flush();
                }
                zis.closeEntry();
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                IOUtil.closeQuietly(zis, bos);
            }
        }
    }
}

输入输出 工具类IOUtil :

import java.io.Closeable;
import java.io.IOException;

/**
 * IO流工具类
 */
public class IOUtil {

    /**
     * 关闭一个或多个流对象
     * @param closeables 可关闭的流对象列表
     * @throws IOException
     */
    public static void close(Closeable... closeables) throws IOException {
        if (closeables != null) {
            for (Closeable closeable : closeables) {
                if (closeable != null) {
                    closeable.close();
                }
            }
        }
    }

    /**
     * 关闭一个或多个流对象
     */
    public static void closeQuietly(Closeable... closeables) {
        try {
            close(closeables);
        } catch (IOException e) {
            // do nothing
        }
    }

}
时间: 2024-10-25 19:10:05

Java.util.zip 压缩与解压缩工具类的相关文章

java.util.zip压缩打包文件总结二: ZIP解压技术

一.简述 解压技术和压缩技术正好相反,解压技术要用到的类:由ZipInputStream通过read方法对数据解压,同时需要通过CheckedInputStream设置冗余校验码,如: CheckedInputStream cis = new CheckedInputStream(new FileInputStream( srcFile), new CRC32()); ZipInputStream zis = new ZipInputStream(cis); 需要注意的是,在构建解压文件时,需要

java.util.zip包在解压缩文件方面入门使用

工作空闲之余,无意间点了一下java.util.zip包下面的一些源码看了一看.知道其使用的范围就是针对我们日常中关于 文件的压缩和解压的操作.写了一些常用的压缩文件(单个文件和多个文件的压缩).解压文件(解压单个文件和文件夹)的 小小Demo. package com.clark.zip; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IO

java I/O解析 及java.util.zip压缩

1.Java I/O框架采用装饰器模式,可按照读写方式分为字节流和字符流,二者根据数据源的不同都封装了不同的类(ByteArray.String.File.Pipe等),FilterInputStream.FilterOutputStream是用来提供装饰器类接口以控制特定输入流和输出流的两个类.字节流和字符流之间可以通过InputStreamReader和OutPutStreamWriter相互转换. 2.常用案例 import java.io.BufferedReader; import j

java.util.zip压缩打包文件总结一:压缩文件及文件下面的文件夹

一.简述 zip用于压缩和解压文件.使用到的类有:ZipEntry  ZipOutputStream 二.具体实现代码 package com.joyplus.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.

Zip - 压缩、解压缩工具

下载地址:https://itunes.apple.com/cn/app/id1175701165?mt=8 一款精致而实用的文件管理App,提供了丰富的文件操作.如果您不经常鼓捣文件,那没关系,把它作为一款图片管理软件吧!还等什么,快下载吧! 特色功能:无线上传.手势锁.定制主题. 便捷功能:图片浏览器.小说阅读器.音乐播放器.视频播放器.文件压缩器.文件解压器.系统剩余空间提示.中文.English系统语言支持. 支持打开的文件类型包括:图片.视频.文档.网页.压缩包(zip,rar,7z)

java生成zip压缩文件,解压缩文件

1.生成zip public static void main(String[] args) { try { // testZip("c:\\temp.txt", "c:\\temp4.zip"); // testZip("c:\\Result.txt", "c:\\temp4.zip"); //不然会被一个文件覆盖了. //压缩多个文件的关键: ZipOutputStream out 作为参数传递. //一个流,否则存在覆盖

Java获取时间 时间计算 转换时间工具类

Java获取时间 时间计算 转换时间工具类 JAVA日期工具类 package com.mh.util; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 时间日期转换工具类 */ public class DateTimeUtil { /** *

AntZipUtils【基于Ant的Zip压缩解压缩工具类】

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 Android 压缩解压zip文件一般分为两种方式: 基于JDK的Zip压缩工具类 该版本存在问题:压缩时如果目录或文件名含有中文,压缩后会变成乱码: 使用Java的zip包可以进行简单的文件压缩和解压缩处理时,但是遇到包含中文汉字目录或者包含多层子目录的复杂目录结构时,容易出现各种各样的问题. 基于Ant的Zip压缩工具类 需要第三方JAR包:Apache的ant.jar: 解决了上面存在的问题. 效果图 代码分析 常用的方法: 压缩

java架构 [Java 基础] 使用java.util.zip包压缩和解压缩文件

Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使用该包中的方法,结合IO中的相关知识,进行文件的压缩和解压缩相关操作. ZipFile java中的每一个压缩文件都是可以使用ZipFile来进行表示的. File file = new File("F:/zippath.zip"); ZipFile zipFile = new ZipFile(file); System.out.println("压缩文