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。

Java 的zip压缩和解压缩的更多相关文章

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

    reference :  http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...

  2. Java用ZIP格式压缩和解压缩文件

    转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutput ...

  3. java采用zip方式实现String的压缩和解压缩CompressStringUtil类

    CompressStringUtil类:不多说,直接贴代码: /** * 压缩 * * @param paramString * @return */ public static final byte ...

  4. Java对zip格式压缩和解压缩

    Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...

  5. Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)

    Java ZIP压缩和解压缩文件(解决中文文件名乱码问题) 学习了:http://www.tuicool.com/articles/V7BBvy 引用原文: JDK中自带的ZipOutputStrea ...

  6. IO操作之使用zip包压缩和解压缩文件

    转自:http://www.cdtarena.com/java.html​​Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使 ...

  7. 使用commons-compress操作zip文件(压缩和解压缩)

    http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可 ...

  8. java工具类——java将一串数据按照gzip方式压缩和解压缩

    我要整理在工作中用到的工具类分享出来,也方便自己以后查阅使用,这些工具类都是我自己实际工作中使用的 import java.io.ByteArrayInputStream; import java.i ...

  9. Linux常用命令学习3---(文件的压缩和解压缩命令zip unzip tar、关机和重启命令shutdown reboot……)

    1.压缩和解压缩命令    常用压缩格式:.zip..gz..bz2..tar.gz..tar.bz2..rar .zip格式压缩和解压缩命令        zip 压缩文件名 源文件:压缩文件   ...

随机推荐

  1. Hibernate(二)——POJO对象的操作

    POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对POJO对象的简单增删改查的操作.  一,Hibernate框架中主键的生成策略有三种方式: 1,数 ...

  2. js记录用户行为浏览记录和停留时间(转)

    演示地址:http://weber.pub/demo/160902/test.html 测试源码下载:http://pan.baidu.com/s/1nvPKbSP 密码:r147 解决问题所使用的知 ...

  3. Android内存泄漏监测(MAT)及解决办法

    http://ttlnews.blogspot.com/2010/01/attacking-memory-problems-on-android.html 这篇文章是2010年1月份写的,其中有些已经 ...

  4. "a newer version of unity web player is required but the auto-update failed"

    问题背景描述: 项目采用winform调用unity web player作为播放器在客户端使用. 在有些环境会出现标题所示错误. 经过一翻研究后发现是插件在向服务器请求更新以下文件时报http 30 ...

  5. sqlite3安装

    SQLite命令行程序(CLP)是开始使用SQLite的最好选择,按照如下步骤获取CLP: 1).打开浏览器进入SQLite主页,www.sqlite.org. 2).单击页面顶部的下载链接(Down ...

  6. 整合 新浪 腾讯 人人 qq空间 分享地址

    function snsShare(snsId, title, content, image, url) { var snsUrl; // 新浪 腾讯 要申请appkey switch (snsId) ...

  7. WIN7系统JavaEE(java+tomcat7+Eclipse)环境配

    在进行 Java Web环境开发之前,首先要做的第一件事就是搭建开发环境,开发环境搭建成功,接下来便是对整个开发环境进行测试,可以通过编写一个简单的JSP 程序发布到Tomcat应用服务器上运行. 1 ...

  8. 关于android的SQLiteDatabase和Cursor的一些疑问

    android数据库操作的基础有三个类:SQLiteOpenHelper,SQLiteDatabase和Cursor.其中,SQLiteOpenHelper会建立一个数据库连接,它虽然可以调用多次ge ...

  9. 设置改变oracle字符集

      修改过密码之后就能以dba的身份进行修改了,不是dba的话在执行修改命令的时候会提示你权限不足. 开始-->运行-->cmd,之后输入:"sqlplus sys/oracle ...

  10. 图的广度、深度优先遍历 C语言

    以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: #include<cstdio> #include<iostr ...