当前位置: 首页 > 编程日记 > 正文

Java 的zip压缩和解压缩

Java 的zip压缩和解压缩
好久没有来这写东西了,今天中秋节,有个东西想拿出来分享,一来是工作中遇到的问题,一来是和csdn问候一下,下面就分享一个Java中的zip压缩技术,代码实现比较简单,代码如下:
package com.meritit.utils.zip;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;/*** @function 实现把指定文件夹下的所有文件压缩为指定文件夹下指定 zip 文件&&实现把指定文件夹下的 zip 文件解压到指定目录下* @createDate:2013-09-18* @author Ysjian*/
public final class ZIPUtils {/*** 测试* * @param args* @throws IOException * @throws ZipException */public static void main(String[] args) throws ZipException, IOException {// 把E:\\Ysjian_Job\\osgistart文件夹下的所有文件压缩到 E:\\test.jar中zip("E:\\test.xlsx", "E:\\test.jar");// 把E:\\test.jar 压缩文件内的所有文件解压到 E:\\test目录下面unZip("E:\\test.jar", "E:\\test");}private ZIPUtils() {}/*** sourceFile 文件进行 zip* 格式的压缩,如果sourceFile是目录,就将sourceFile目录下所有的文件及子目录压缩,如果sourceFile是文件* ,将sourceFile文件压缩,保存为指定 .zip或者.jar 文件* * @param sourceFile*            源文件,* @param savedFile*            保存的文件,可以是.zip或者.jar形式* */public static void zip(String sourceFile, String savedFile) {ZipOutputStream zos = null;try {zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(savedFile)));File file = new File(sourceFile);@SuppressWarnings("unused")boolean zip = file.isDirectory() ? zipFile(file, file.getPath(),zos) : zipFile(file, file.getParent(), zos);} catch (FileNotFoundException e) {throw new RuntimeException("filePath is invalid-->" + savedFile, e);} finally {try {zos.closeEntry();zos.close();} catch (IOException e) {throw new RuntimeException("fail to close the ZipOutputStream",e);}}}/*** 压缩文件,利用到了递归* * @param source* @param basePath* @param zos* @throws IOException*/private static boolean zipFile(File source, String basePath,ZipOutputStream zos) {File[] files = null;if (source.isDirectory()) {files = source.listFiles();} else {files = new File[1];files[0] = source;}String path = null;byte[] buf = new byte[1024];int length = 0;BufferedInputStream bis = null;try {for (File file : files) {if (file.isDirectory()) {path = file.getPath().substring(basePath.length() + 1)+ "/";zos.putNextEntry(new ZipEntry(path));zipFile(file, basePath, zos);} else {path = file.getPath().substring(basePath.length() + 1);bis = new BufferedInputStream(new FileInputStream(file));zos.putNextEntry(new ZipEntry(path));while ((length = bis.read(buf)) > 0) {zos.write(buf, 0, length);}}}} catch (Exception e) {e.printStackTrace();} finally {if (bis != null) {try {bis.close();} catch (IOException e) {throw new RuntimeException("fail to close the ZipOutputStream", e);}}}return true;}/*** 解压 zip 文件,只能解压标准的 zip文件* * @param sourceFile*            标准的 zip 文件,不能是把 rar 的直接改为 zip 这样会出现java.io.IOException* @param targetDir*            存放的目錄* @throws ZipException* @throws IOException*/@SuppressWarnings("resource")public static void unZip(String sourceFile, String targetDir)throws ZipException, IOException {targetDir = targetDir.endsWith("//") ? targetDir : targetDir + "//";byte b[] = new byte[1024];ZipFile zipFile = null;BufferedOutputStream bos = null;zipFile = new ZipFile(new File(sourceFile));Enumeration<?> enumeration = zipFile.entries();while (enumeration.hasMoreElements()) {ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();File loadFile = new File(targetDir + zipEntry.getName());if (!zipEntry.isDirectory()) {if (!loadFile.getParentFile().exists()) {loadFile.getParentFile().mkdirs();}OutputStream os = new FileOutputStream(loadFile);InputStream inputStream = zipFile.getInputStream(zipEntry);bos = new BufferedOutputStream(os);int length = 0;while ((length = inputStream.read(b)) > 0) {bos.write(b, 0, length);}}}}
}
最近工作利用了OSGi,需要在代码中手动生成jar包,也就是bundle,所以采用了这种技术去生成jar包。利用了zip压缩,将事先用eclipse生成的bundle的jar包解压出来,在向里面添加自己的文件,然后在压缩成jar。

转载于:https://www.cnblogs.com/pangblog/p/3331446.html

相关文章:

Hadoop集群搭建(九:各服务的启动)

1、查看Zookeeper服务状态&#xff0c;若集群中只有一个"leader"节点&#xff0c; 其余的均为"follower"节点&#xff0c;则集群的工作状态正常 $zkServer.sh status 2、在集群中所有主机上使用此命令&#xff0c;启动Zookeeper服务 $zkServer.sh start…

iOS 后台下载及管理库

说起下载第一个想起的就是ASI。一年前接手的新项目是核心功能是视频相关业务&#xff0c;在修改和解决视频下载相关的问题的时候让我体会到了ASI的下载的强大。后来新需求需要视频后台下载&#xff0c;使用NSURLSession的时候&#xff0c;更加深刻的体会到了ASI的强大好用。后来…

(转) 使用Speech SDK 5.1文字转音频

下载地址&#xff1a; http://www.microsoft.com/en-us/download/details.aspx?id10121 SeppchSDK51.exe 语音合成引擎 SpeechSDK51LangPack.exe 支持日语和简体中文需要这个支持。 SpeechSDK51MSM.exe 如果要将引擎作为产品的一部分发布需要这个。 Sp5TTintXP.exe XP下Mike和…

IE8下面的line-height的bug

当line-height小于正常值时&#xff0c;超出的部分将被剪裁掉转载于:https://www.cnblogs.com/jsingleegg/p/js_ie8.html

Hadoop集群的基本操作(一:HDFS操作及MapReduce程序练习)

实验 目的 要求 目的&#xff1a; 理解HDFS在Hadoop体系结构中的角色&#xff1b;熟练使用HDFS操作常用的Shell命令&#xff1b;了解Hadoop集群MapReduce程序的简单使用&#xff1b;&#xff08;上传WordCount的jar执行程序&#xff1b;使用WordCount进行MapReduce计算&#x…

iOS实现动态区域裁剪图片

阅读 249收藏 322017-11-29原文链接&#xff1a;github.com想自己动手搭建一个 Discuz 论坛&#xff1f;试试腾讯云上实验室吧https://cloud.tencent.com/developer/labs 裁剪图片功能在很多上传图片的场景里都需要用到&#xff0c;一方面应用服务器可能对图片的尺寸大小有限制…

每天CookBook之JavaScript-062

鼠标进入事件鼠标离开事件<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>062</title> </head> <body> <div><img src"001" alt"001"><img src…

spring + Quartz定时任务配置

<bean id"exportBatchFileTask" class"com.ydcn.pts.task.ExportBatchFileTask"></bean><bean id"readBatchFileTask" class"com.ydcn.pts.task.ReadBatchFileResultTask"></bean><!-- 生成开卡档&#xf…

Hadoop集群的基本操作(二:HBase的基本操作)

实验 目的 要求 目的&#xff1a; 1、HBase的基本应用 要求&#xff1a; 完成HBase的高可用完全分布模式的安装&#xff1b;HBase的相关服务进程能够正常的启动&#xff1b;HBase控制台能够正常使用&#xff1b;表创建、数据查询等数据库操作能够正常进行&#xff1b; …

Abaqus用户子程序umat的学习

Abaqus用户子程序umat的学习 说明&#xff1a;在文件中&#xff0c;&#xff01;后面的内容为注释内容。本文为学习心得&#xff0c;很多注释是自己摸索得到。如有不正确的地方&#xff0c;敬请指正。 ! —————————————————————————— ! 1、为何需要…

PHP:isset()-检测变量是否被设置

isset()-检测变量是否被设置 bool isset(mixed $var [, mixed $...])&#xff0c;检查变量是否被设置&#xff0c;并且不是NULL。var,要检测的变量&#xff0c;...其他变量&#xff0c;允许有多个变量。 返回值&#xff1a;如果var存在并且不是NULL&#xff0c;则返回TRUE&…

Android通过ShareSDK实现新浪微博分享

ShareSDK社会化分享的官方说明&#xff1a;是中国最大的APP内分享服务提供商&#xff0c;ShareSDK社会化分享&#xff0c;全面支持微信&#xff0c;微博&#xff0c;QQ空间&#xff0c;来往&#xff0c;易信&#xff0c;Facebook等国内外40个平台。 ShareSDK官方网站&#xff…

Hadoop集群的基本操作(三:HBase的基本操作)

实验 目的 要求 目的&#xff1a; MySQL数据库的基本命令&#xff1b;MySQL数据库中使用SQL语句&#xff1b;MySQL数据库中数据库&#xff0c;表&#xff0c;数据的操作&#xff1b;要求&#xff1a; 完成MySQL的集群版的安装&#xff1b;MySQL集群的相关服务进程能够正常启…

iOS通过Plist保存离线调试日志

最近需要测试APP在iPhone没连接USB情况下定位时间间隔的情况&#xff0c;固把nslog的日志信息保存成本地Plist文件&#xff0c;以便测试结束后查阅运行时的日志。 一、新建一个保存日志的方法&#xff0c;参数为每次定位成功的时间&#xff08;作为key&#xff09;&#xff0c…

关于变量名前面加m的问题

为什么很多人写代码会在变量名前面加一个小写的m&#xff1f; 上大学那会儿就对这个问题感到很好奇。于是网上到处搜&#xff0c;有人说是member的意思。于是后来一直就这么认为。 最近在读Android源码&#xff0c;发现很多系统变量命名时都加了m&#xff0c;而有的变量又没有加…

谷歌推出情境感知API

在 Google I/O 2016 大会上&#xff0c;我们宣布推出新的 Google Awareness API&#xff0c;让您的应用可以利用快照和围栏智能应对用户情境&#xff0c;并且仅需占用极少量的系统资源。 所有开发者均可以通过 Google Play 服务获取 Google Awareness API。 利用 7 种不同类型的…

Hadoop集群的基本操作(四:Hive的基本操作)

实验 目的 要求 目的&#xff1a; &#xff08;1&#xff09;掌握数据仓库工具Hive的使用&#xff1b; 要求&#xff1a; 掌握数据仓库Hive的使用&#xff1b;能够正常操作数据库、表、数据&#xff1b; 实 验 环 境 五台独立PC式虚…

【转】通过Hibernate将数据 存入oracle数据库例子

一、 Hibernate介绍 Hibernate是基于对象/关系映射&#xff08;ORM&#xff0c;Object/Relational Mapping&#xff09;的一个解决方案。ORM方案的思想是将对象模型表示的对象映射到关系型数据库中&#xff0c;或者反之。Hibernate目前是ORM思想在Java中最成功、最强大的实现。…

自动布局按钮排列平均分布

需要实现如下图所示的主页面布局&#xff0c;需要两排按钮&#xff0c;每一排都自动平均分布&#xff0c;Android的话直接用LinearLayout水平布局&#xff0c;并设置layout_weight即可&#xff0c;对于iOS&#xff0c;网上有使用代码实现&#xff0c;感觉略麻烦&#xff0c;我直…

maven3 手动安装本地jar到仓库

安装命令&#xff1a; mvn install:install-file -Dfile{Path/to/your/ojdbc.jar} -DgroupIdcom.oracle -DartifactIdojdbc6 -Dversion11.2.0 -Dpackagingjar我自己安装oracle14.jar 时命令如下&#xff1a;mvn install:install-file -DgroupIdcom.oracle -DartifactIdojdbc14 …

Hadoop集群的基本操作(五:Sqoop的基本操作)

实验 目的 要求 目的&#xff1a; 掌握ETL工具Sqoop的使用&#xff1b;掌握MySQL和HDFS之间的数据转换&#xff1b;要求&#xff1a; 掌握ETL工具Sqoop的使用&#xff1b;能够正常操作数据库、表、数据&#xff1b; 实 验 环 境 五台…

NEWS - InstallShield 2013 SP1发布

2013的这个国庆假期期间&#xff0c;InstallShield厂商Flexerasoftware&#xff08;中文名&#xff1a;福莱睿&#xff09;发布了最新版本InstallShield 2013的SP1&#xff0c;由于这个升级包带来一些新的技术支持和变化&#xff0c;所以特地给大家介绍一下&#xff1a; 1. 支持…

iOS 高德导航按返回后报错 解决

最近项目要添加导航功能&#xff0c;用了高德导航SDK&#xff0c;很郁闷每次从地图界面返回前一页面都报错&#xff0c;弄了很久&#xff0c;最终从高德开发者论坛找到一解决方法&#xff0c;可以试一下。 在导航的ViewController的viewWillDisappear中调用如下方法&#xff0…

Oracle的基本操作(一:子查询与常用函数)

1、描述TO_CHAR和TO_DATE函数的用法。 TO_CHAR&#xff08;d|n[,fmt]):把日期和数字转换为指定格式(fmt)的字符串; TO_DATE(x[,fmt]):把一个字符串一fmt格式转换为一个日期类型&#xff1b; 举例&#xff1a;select to_char(sysdate,yyyy-mm-dd) "char", to_date(…

易买网的一些增删改查

正如题目所说的一样,今天就来说说易买网中的一些增删改查,主要的功能有注册、用户管理以及商品分类等&#xff01; 1.注册 1.1 注册涉及到了一个ajax远端技术,主要是用来控制注册用户在数据库中是否存在&#xff1a; <script>$(function(){//焦点移出表单时$("#user…

iOS后台持续定位并定时上传

最近做一个考勤APP&#xff0c;功能很简单&#xff0c;就是一直在后台运行&#xff0c;每隔固定时间向服务器上传一次位置信息。持续运行24小时测试&#xff0c;功能实现。 1.ViewController.h文件&#xff1a; #import <CoreLocation/CoreLocation.h>并实现CLLocationMa…

jQuery UI vs Kendo UI jQuery Mobile vs Kendo UI Mobile

jQuery UI vs Kendo UI http://jqueryuivskendoui.com/#introduction jQuery Mobile vs Kendo UI Mobile http://jqueryuivskendoui.com/#mobile-introduction Kendo UI教程 http://www.cnblogs.com/pangblog/archive/2013/09/10/3313135.html转载于:https://www.cnblogs.com/j…

Oracle的基本操作(二:存储过程)

1、编写一个存储过程&#xff0c;根据输入的工作类型&#xff0c;输入该工作的平均工资。 -- Created on 2018/9/30 by YANXUKUNcreate or replace procedure avgsal(v_job in scott.emp.job%type)isavgsal2 number;beginselect avg(sal) into avgsal2 from scott.emp where j…

web11 Struts处理表单数据

电影网站&#xff1a;www.aikan66.com 项目网站&#xff1a;www.aikan66.com 游戏网站&#xff1a;www.aikan66.com 图片网站&#xff1a;www.aikan66.com 书籍网站&#xff1a;www.aikan66.com 学习网站&#xff1a;www.aikan66.com Java网站&#xff1a;www.aikan66.co…

瀑布流开源这两天

想必第一眼看到 Masonery 效果的人们会和当初的我有同样的感觉&#xff0c;惊艳&#xff01;尤其是在你双击浏览器标题栏的空白处之后&#xff0c;所有的区块都在默默寻找自己的位置&#xff0c;无论大小&#xff0c;就像上海虹桥火车站涌入地铁的人群。和技术实现无关&#xf…