使用JDK的zip编写打包工具类
JDK自带的zip AIP在java.util.zip包下面,主要有以下几个类:
java.util.zip.ZipEntry
java.util.zip.ZipInputStream
java.util.zip.ZipOutputStream
本文编写的zip工具类有以下功能:打包(单个文件、目录)、解包、查看zip包文件
工具类代码如下
- package org.net5ijy.util.zip;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.zip.ZipEntry;
- import java.util.zip.ZipInputStream;
- import java.util.zip.ZipOutputStream;
- /**
- * ZIP工具类
- *
- */
- public class ZipUtil {
- /**
- * 解包时的读写大小:10MB
- */
- private static final int SIZE = 1024 * 1024 * 10;
- /**
- * 打包
- *
- * @param src
- * - 需要打包的文件或目录,不可以是根目录,为根目录时抛出IOException
- * @param zipFile
- * - 打包后的.zip文件
- * @throws IOException
- */
- public static void zip(File src, File zipFile) throws IOException {
- // 不可以压缩根目录
- if (src.getParent() == null) {
- throw new IOException("不可以压缩根目录");
- }
- // 获取基目录
- String base = src.getParentFile().getAbsolutePath();
- ZipOutputStream out = null;
- BufferedOutputStream bos = null;
- try {
- out = new ZipOutputStream(new FileOutputStream(zipFile));
- // 创建缓冲输出流
- bos = new BufferedOutputStream(out);
- // 调用函数
- zip(out, bos, src, base);
- } catch (IOException e) {
- e.printStackTrace();
- throw e;
- } finally {
- // 关闭流
- if (bos != null) {
- bos.close();
- }
- if (out != null) {
- out.close();
- }
- }
- }
- private static void zip(ZipOutputStream out, BufferedOutputStream bos,
- File sourceFile, String base) throws IOException {
- // 如果路径为目录(文件夹)
- if (sourceFile.isDirectory()) {
- out.putNextEntry(new ZipEntry(sourceFile.getAbsolutePath().replace(
- base + File.separator, "")
- + "/"));
- // 取出文件夹中的文件(或子文件夹)
- File[] flist = sourceFile.listFiles();
- if (flist.length > 0) {
- for (int i = 0; i < flist.length; i++) {
- zip(out, bos, flist[i], base);
- }
- }
- } else {// 如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
- out.putNextEntry(new ZipEntry(sourceFile.getAbsolutePath().replace(
- base + File.separator, "")));
- BufferedInputStream bis = null;
- try {
- // 文件输入流
- bis = new BufferedInputStream(new FileInputStream(sourceFile));
- int b = bis.read();
- // 将源文件写入到zip文件中
- while (b > -1) {
- bos.write(b);
- b = bis.read();
- }
- bos.flush();
- } catch (Exception e) {
- throw e;
- } finally {
- if (bis != null) {
- bis.close();
- }
- }
- }
- }
- /**
- * 解包
- *
- * @param zipFile
- * - 需要解包的.zip文件
- * @param targetFolder
- * - 目标目录
- * @throws IOException
- */
- public static void unzip(File zipFile, File targetFolder)
- throws IOException {
- // 如果源文件是null 或者 不是一个文件
- if (zipFile == null || !zipFile.isFile()
- || !zipFile.getName().endsWith(".zip")) {
- throw new IOException("请选择正确的.zip文件");
- }
- // 如果目标目录为null 或者 不是一个目录
- if (targetFolder == null || !targetFolder.isDirectory()) {
- throw new IOException("请选择正确的解压目录");
- }
- // 定义zip文件输入流
- ZipInputStream zin = null;
- try {
- // 从zipFile创建对应的ZipInputStream输入流
- zin = new ZipInputStream(new FileInputStream(zipFile));
- // 获取下一个条目
- for (ZipEntry entry = zin.getNextEntry(); entry != null; entry = zin
- .getNextEntry()) {
- // 获取文件或者目录名
- String name = entry.getName();
- // 目录
- if (name.endsWith("/")) {
- File dir = new File(targetFolder, name);
- dir.mkdirs();
- } else {// 文件
- unzip(targetFolder, zin, name);
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- throw e;
- } finally {
- if (zin != null) {
- zin.close();
- }
- }
- }
- private static void unzip(File targetFolder, ZipInputStream zin, String name)
- throws IOException {
- // 定义输出流
- FileOutputStream out = null;
- try {
- // 创建输出流
- out = new FileOutputStream(new File(targetFolder.getAbsolutePath()
- + File.separator + name));
- byte[] buf = new byte[SIZE];
- int len = zin.read(buf);
- while (len > -1) {
- out.write(buf, 0, len);
- len = zin.read(buf);
- }
- out.flush();
- } catch (Exception e) {
- throw e;
- } finally {
- if (out != null) {
- out.close();
- }
- }
- }
- /**
- * 获取.zip文件中的条目集合
- *
- * @param zipFile
- * - 待查看的.zip文件
- * @return 条目的集合
- * @throws IOException
- */
- public static List<ZipEntry> zipEntryList(File zipFile) throws IOException {
- // 如果源文件是null 或者 不是一个文件
- if (zipFile == null || !zipFile.isFile()) {
- throw new IOException("请选择正确的.zip文件");
- }
- // 定义zip文件输入流
- ZipInputStream zin = null;
- List<ZipEntry> l = new ArrayList<ZipEntry>();
- try {
- // 从zipFile创建对应的ZipInputStream输入流
- zin = new ZipInputStream(new FileInputStream(zipFile));
- // 获取下一个条目
- ZipEntry entry = zin.getNextEntry();
- while (entry != null) {
- l.add(entry);
- entry = zin.getNextEntry();
- }
- } catch (IOException e) {
- e.printStackTrace();
- throw e;
- } finally {
- if (zin != null) {
- zin.close();
- }
- }
- return l;
- }
- /**
- * 获取.zip文件中的条目名称集合
- *
- * @param zipFile
- * - 待查看的.zip文件
- * @return 条目名称集合
- * @throws IOException
- */
- public static List<String> zipEntryNameList(File zipFile)
- throws IOException {
- List<String> l = new ArrayList<String>();
- List<ZipEntry> entryList = zipEntryList(zipFile);
- for (ZipEntry zipEntry : entryList) {
- l.add(zipEntry.getName());
- }
- return l;
- }
- }
测试代码
- import static org.net5ijy.util.zip.ZipUtil.*;
- public class ZipUtilTest {
- public static void main(String[] args) throws IOException {
- zip(new File(
- "D:\\workspace\\SpringCloud\\zip-demo\\src\\org\\net5ijy\\util\\zip\\ZipUtil.java"),
- new File("d:\\zip01.zip"));
- zip(new File("D:\\workspace\\SpringCloud\\spring-data-demo2\\"),
- new File("d:\\zip02.zip"));
- unzip(new File("d:\\zip02.zip"), new File("D:\\a\\"));
- List<String> nameList = zipEntryNameList(new File("d:\\zip02.zip"));
- for (String name : nameList) {
- System.out.println(name);
- }
- }
- }
使用JDK的zip编写打包工具类的更多相关文章
- 【SSH三大框架】Hibernate基础第二篇:编写HibernateUtil工具类优化性能
相对于上一篇中的代码编写HibernateUtil类以提高程序的执行速度 首先,仍然要写一个javabean(User.java): package cn.itcast.hibernate.domai ...
- AntZipUtils【基于Ant的Zip压缩解压缩工具类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 Android 压缩解压zip文件一般分为两种方式: 基于JDK的Zip压缩工具类 该版本存在问题:压缩时如果目录或文件名含有中文, ...
- JSR303完成validate校验并编写BeanValidator工具类
一.引入pom依赖 <!-- validator --> <dependency> <groupId>javax.validation</groupId> ...
- JDK在线API及常用工具类
API http://tool.oschina.net/apidocs/apidoc?api=jdk-zh Java SE常用工具类 java.util.Arrays java.util.Collec ...
- java jdk原生的http请求工具类
package com.base; import java.io.IOException; import java.io.InputStream; import java.io.InputStream ...
- Zip操作的工具类
/** * Copyright 2002-2010 the original author is huanghe. */package com.ucap.web.cm.webapp.util; ...
- JDBC_part2_DML以及预编译_编写DBUtil工具类
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! jdbc day02 DML语法 比起插叙语句,没有R ...
- 观察者模式学习--使用jdk的工具类简单实现
观察者模式学习之二:使用jdk的自带的工具类实现,与自己实现相比,两者有以下的区别: 1,自己实现,需要定义观察者的接口类和目标对象的接口类.使用java util的工具类,则不需要自己定义观察者和目 ...
- Java操作zip压缩和解压缩文件工具类
需要用到ant.jar(这里使用的是ant-1.6.5.jar) import java.io.File; import java.io.FileInputStream; import java.io ...
随机推荐
- 关于event 和 window.event问题及浏览器兼容问题
< html> < script language="javascript"> function test(event) { event = event | ...
- 基于vue和echarts的数据可视化实现
基于vue和echarts的数据可视化: https://github.com/MengFangui/awesome-vue.git
- 阿里巴巴Druid数据源组件
目前常用的数据源主要有c3p0.dbcp.proxool.druid,先来说说他们Spring 推荐使用dbcp:Hibernate 推荐使用c3p0和proxool1. DBCP:apacheDBC ...
- centos 7 U盘 uefi 模式装机
公司买了一台新的dell机器,因为装的是window ,所以想给改成Centos 的做服务器,但是问题来了,一上来装好,就完全进入不了引导系统,换了ubuntu 有一次意外装上了,但一直是什么原因,然 ...
- 真机调试No target device的解决(android studio)3.4.1
驱动等都正常,手机连接正常.但是还是报错 搜索到如下办法成功解决:adb未启动或启动失败,这时候选择android studio界面底端的logcat,会自动重启adb.
- Loadrunner查询博客列表并循环删除博客列表中的所有博客
Loadrunner查询博客列表并循环删除博客列表中的所有博客,在博客列表请求中使用关联,获取出列表中博客的数量,并找出博客列表请求的必要参数.关联使用Ordinal=All 找出所有匹配值 查找出所 ...
- JSON字符串转实体对象
JSON转实体两种方式 代码片段 ; i < dt.Rows.Count; i++) { //Json字符串 string designJson = dt.Rows[i]["Desig ...
- word2vec原理总结
一篇很好的入门博客,http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/ 他的翻译,https://www. ...
- Nginx实践篇(5)- Nginx代理服务 - 代理缓冲区、代理重新定义请求头、代理连接超时(转)
Nginx实践篇(5)- Nginx代理服务 - 代理缓冲区.代理重新定义请求头.代理连接超时 nginx参数默认值 http://nginx.org/en/docs/http/ngx_http_co ...
- Django ORM 以连接池方式连接底层连接数据库方法
django原生支持是不支持 以连接池方式连接数据库的 概述 在使用 Django 进行 Web 开发时, 我们避免不了与数据库打交道. 当并发量低的时候, 不会有任何问题. 但一旦并发量达到一定数量 ...