博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 基础【15】 压缩与解压缩
阅读量:4952 次
发布时间:2019-06-12

本文共 4755 字,大约阅读时间需要 15 分钟。

    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        }    }}

 

转载于:https://www.cnblogs.com/java-class/p/5662934.html

你可能感兴趣的文章
iOS学习笔记 ——Trip to iOS
查看>>
[开发笔记]UIApplication介绍
查看>>
GPIO外部中断
查看>>
ios 第三方qq授权登陆,第一次登陆后,再次登陆,失效
查看>>
扔鸡蛋问题具体解释(Egg Dropping Puzzle)
查看>>
express: command not found.
查看>>
TinyXml高速入门(一)
查看>>
点击表格的单元格时实现变颜色,通过for循环为每个单元格添加一个onclick事件...
查看>>
webform Response的一些成员
查看>>
Countries in War(强连通分量及其缩点)
查看>>
Eclipse中用Link方式安装Maven插件(转载)
查看>>
Android菜鸟的成长笔记(11)——Android中的事件处理
查看>>
JStrom的zk数据
查看>>
使用“dotconnect for oracle”绕过oracle客户端连接Oracle数据库
查看>>
CentOS/RHEL Linux安装EPEL第三方软件源
查看>>
redisson
查看>>
Weblogic集群
查看>>
HDU 5351 MZL's Border (多校联合第5场1009)
查看>>
js三种定义类的方法
查看>>
离线批量数据通道Tunnel的最佳实践及常见问题
查看>>