Java 基础【15】 压缩与解压缩
2023-09-27 14:22:34 时间
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 } } }
相关文章
- 【并发基础】Java中的fail-fast(快速失败)机制
- java基础---->自定义gradle的插件
- 海康JAVA SDK库动态路径加载
- java接口签名(Signature)实现方案
- java 基础
- java实现mysql数据库的备份及还原
- jboss合struts遇到的问题(路径jsp编译后的java和class文件)
- Java菜鸟学习笔记--Exception篇(一):异常简介
- 【Java 基础】字符串处理、正则表达式 及其 相关方法
- 从思维图到基础再到深入,Java多态实现原理解析
- Java基础——NIO(一)通道与缓冲区
- Java菜鸟学习笔记--面向对象篇(十八):对象转型&多态
- Java 基础
- java rsa 解密报:javax.crypto.BadPaddingException: Decryption error
- Java 并发基础常见面试题总结
- java 测量运行时间 单位:毫秒
- Java 基础面试题——面向对象
- Java 基础 (IO标准的输入,输出流,打印流,数据流)
- Java 基础(java.util.Calendar 日历类)
- Java 基础(包装类 Wrapper 的使用)
- java项目部署
- java中接口的定义与实现
- java visual VM使用简介
- Java 25天基础-DAY 05-面向对象封装
- Java 25天基础-DAY 07-面向对象-继承子父类中变量的特点-函数的另一个特性重写(覆盖)
- JAVA WEB 解决编码问题的filter
- Java编程基础:配置log4j2.xml同时输出日志到文件和控制台
- 大数据必学Java基础(七十三):数据流DataInputStream和DataOutputStream介绍
- Java字节流基础详解(InputStream/OutputStream)
- java下发电子邮件demo
- 剑指offer【04】- 重建二叉树(java)
- 我的Java开发学习之旅------>Java String对象作为参数传递的问题解惑
- 【Java基础系列】List,String,Set换转