java-a实现压缩与解压缩(zip、gzip)
zip扮演着归档和压缩两个角色;gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩。
Java I/O类库还收录了一些能读写压缩格式流的类。要想提供压缩功能,只要把它们包在已有的I/O类的外面就行了。这些类不是Reader和Writer,而是InputStream和OutStreamput的子类。这是因为压缩算法是针对byte而不是字符的。
需要注意的是:java自带的工具类在windows压缩处理编码无法处理中文,所以不建议使用jre
相关类与接口:
Checksum 接口:被类Adler32和CRC32实现的接口
Adler32 :使用Alder32算法来计算Checksum数目
CRC32 :使用CRC32算法来计算Checksum数目 CheckedInputStream :InputStream派生类,可得到输入流的校验和Checksum,用于校验数据的完整性
CheckedOutputStream :OutputStream派生类,可得到输出流的校验和Checksum, 用于校验数据的完整性 DeflaterOutputStream :压缩类的基类。
ZipOutputStream :DeflaterOutputStream的一个子类,把数据压缩成Zip文件格式。
GZIPOutputStream :DeflaterOutputStream的一个子类,把数据压缩成GZip文件格式 InflaterInputStream :解压缩类的基类
ZipInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据
GZIPInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据 ZipEntry 类:表示 ZIP 文件条目
ZipFile 类:此类用于从 ZIP 文件读取条目
压缩类的用法非常简单;只要用GZIPOutputStream 或ZipOutputStream把输出流包起来,再用GZIPInputStream 或ZipInputStream把输入流包起来就行了。剩下的都是些普通的I/O操作。
测试
package com.jre.util.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.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream; import com.jre.io.UtilsIoJre; /**
* zip文件处理(压缩处理时通过windows系统压缩的由于编码不是utf8的所以将导致中文抛出异常的情况)
* @author huage
*
*/
public class UtilsZipJre { public static void main(String[] args) {
zipFileExtract("C:\\Users\\huage\\Desktop\\test\\111\\111.zip","C:\\Users\\huage\\Desktop\\test\\test");
//zipDecompressingExtract("C:\\Users\\huage\\Desktop\\test\\111\\111.zip","C:\\Users\\huage\\Desktop\\test\\test");
//zipCompressingExtract("C:\\Users\\huage\\Desktop\\test\\111\\test.zip",new File("C:\\Users\\huage\\Desktop\\test\\test")); } /**
* 解压
* @param path
* @param pathExtract
*/
public static void zipFileExtract(String path, String pathExtract){
ZipFile zipfile = null;
try {
zipfile = new ZipFile(path);
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>)zipfile.entries();
if( entries!=null ){
ZipEntry entry ;
File file;
BufferedInputStream bis = null;
while( entries.hasMoreElements()){
entry = entries.nextElement();
if(entry.isDirectory())continue;
file=new File(pathExtract,entry.getName());
if(!file.exists()){
(new File(file.getParent())).mkdirs();
}
UtilsIoJre.converWriteIO(bis, file);
//System.out.println(fout+"解压成功");
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally{
UtilsIoJre.closeIO(zipfile);
} } /**
* zip解压(本地)(官方自带zip解压无法处理中文)
*
* @param path
* :zip文件地址
* @param pathExtract
* :解压地址
*/
public static void zipDecompressingExtract(String path, String pathExtract) {
ZipInputStream zipinput = null;
BufferedInputStream bininput = null;
try {
zipinput = new ZipInputStream(new FileInputStream(path));
bininput = new BufferedInputStream(zipinput); ZipEntry entry ;
File fout = null;
while ((entry = zipinput.getNextEntry()) != null) {
if(entry.isDirectory())continue;
fout=new File(pathExtract,entry.getName());
if(!fout.exists()){
(new File(fout.getParent())).mkdirs();
}
UtilsIoJre.converWriteIO(bininput, fout);
//System.out.println(fout+"解压成功");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
UtilsIoJre.closeIO(bininput,zipinput);
}
System.out.println("解压完成");
} /**
* zip压缩(本地)
*
* @param zipFileName
* @param inputFile
* @throws Exception
*/
public static void zipCompressingExtract(String zipFileName, File inputFile) {
ZipOutputStream out = null;
BufferedOutputStream bo = null;
try {
out = new ZipOutputStream(new FileOutputStream(zipFileName));
bo = new BufferedOutputStream(out);
zipCompressing(out, inputFile, bo);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
UtilsIoJre.closeIO(bo,out);
}
System.out.println("压缩完成");
} /**
* zip压缩
*
* @param out
* @param file
* @param base
* @param bo
* @throws Exception
*/
private static void zipCompressing(ZipOutputStream out, File file, BufferedOutputStream bo) throws Exception {
if (file.isDirectory()) {
File[] fl = file.listFiles();
if (fl.length == 0) {
out.putNextEntry(new ZipEntry(file.getName()));
}
for (int i = 0; i < fl.length; i++) {
zipCompressing(out, fl[i], bo);
}
} else {
out.putNextEntry(new ZipEntry(file.getName() ));
UtilsIoJre.converReadIO(bo, file);
}
}
} package com.jre.io; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream; /**
* io流处理
* @author huage
*
*/
public class UtilsIoJre { /**
* 将file写入BufferedOutputStream中
* @param bo
* @param file
* @throws Exception
*/
public static void converReadIO(BufferedOutputStream bo,File file) throws Exception{
FileInputStream in = new FileInputStream(file);
BufferedInputStream bi = new BufferedInputStream(in);
int b;
while ((b = in.read()) != -1) {
bo.write(b);
}
closeIO(bi,in);
bo.flush();//清空缓存
} /**
* 将BufferedInputStream写入file中
* @param bo
* @param file
* @throws Exception
*/
public static void converWriteIO(BufferedInputStream bininput,File file) throws Exception{
FileOutputStream out = new FileOutputStream(file);
BufferedOutputStream bout = new BufferedOutputStream(out);
int b;
while ((b = bininput.read()) != -1) {
bout.write(b);
}
closeIO(bout,out);
bout.flush();//清空缓存
} /**
* 关闭io
* @param cl
*/
public static void closeIO(AutoCloseable... cl){
if( cl == null || cl.length == 0 )return;
for (AutoCloseable c : cl) {
try {
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
java-a实现压缩与解压缩(zip、gzip)的更多相关文章
- PclZip:强大的PHP压缩与解压缩zip类
PclZip简介PclZip是一个很强大的压缩与解压缩zip文件的PHP类,PclZip library能够压缩与解压缩Zip格式的压缩档(WinZip.PKZIP):且能对此类类档案进行处理,包括产 ...
- Python3 压缩与解压缩(zlib / gzip / bz2 / lzma / zipfile / tarfile)
本文由 Luzhuo 编写,转发请保留该信息. 原文: http://blog.csdn.net/Rozol/article/details/72672703 以下代码以Python3.6.1为例 L ...
- ICSharpCode.SharpZipLib工具压缩与解压缩zip文件
using System; using System.Collections.Generic; using System.IO; using System.Text; using ICSharpCod ...
- java 版本压缩、解压缩zip
import java.io.*; import java.util.*; import java.util.zip.ZipOutputStream; import java.util.zip.Zip ...
- 利用Java进行zip文件压缩与解压缩
摘自: https://www.cnblogs.com/alphajuns/p/12442315.html 工具类: package com.alphajuns.util; import java.i ...
- java压缩/解压缩zip格式文件
因为项目要用到压缩.解压缩zip格式压缩包,只好自己封装一个,对于网上流行的中文乱码的问题,本文的解决方法是用apache的包代替jdk里的.基本上还是比较好用的. 废话少说,直接上代码. } ...
- Java 基础【12】 压缩与解压缩
Java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类. 还包括使用 DEFLATE 压缩算法(用于 ZIP 和 GZIP 文件格式)对数据进行压缩和解压缩的类. 依赖 Jd ...
- Java 基础【15】 压缩与解压缩
Java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类. 还包括使用 DEFLATE 压缩算法(用于 ZIP 和 GZIP 文件格式)对数据进行压缩和解压缩的类. 依赖 Jd ...
- linux zip命令 tar命令 【压缩、解压缩】参数列表:
linux zip命令参数列表: -a 将文件转成ASCII模式 -F 尝试修复损坏的压缩文件 -h 显示帮助界面 -m 将文件压缩之后,删除源文件 -n 特定字符串 不压缩具有特定字尾字符串 ...
- Java生成压缩文件(zip、rar 格式)
jar坐标: <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</ar ...
随机推荐
- python 使用pip安装第三方模块
part 1:使用方法: 1.pip install somePackage picture 1 2.pip show somePackage 例如:pip show pip 弹出关于该模块的信息 p ...
- 命令行构建Unity项目
自动任务构建 通常可以在桌面双击 Unity 图标,启动程序,但是,也可以通过命令行(例如,MacOS 终端或 Windows Command 窗口)运行程序.若使用这种方式启动 Unity,它将可以 ...
- MySQL注射的过滤绕过技巧[1]
SQL注射的绕过技巧较多,此文仅做一些简单的总结. 前文已经提到,最好利用的注射点: 支持Union 可报错 支持多行执行.可执行系统命令.可HTTP Request等额外有利条件 若非以上类型,则可 ...
- cocoapod
更新代码: sudo gem install -n /usr/local/bin cocoapods --pre ex: The dependency `` is not used in any co ...
- 关于Xcode7.2版本访问相册问题
前些天自己将xcode升级到7.2版本后,在我写的代码中有需要访问到相册的功能,但是却发现被告知无权限 一开始以为是手机问题,在设置里面找也没有找到,然后看代码,但是代码也没问题,后来才发现是我的pl ...
- Laterality issue on fMRI image
The laterality issue: different software will interpret fMRI images in different way (mainly refer t ...
- P3398 仓鼠找sugar
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- 045医疗项目-模块四:采购单模块—采购单提交(Dao,Service,Action三层)
我们之前做的就是采购单的编辑,在采购单里面添加了药品,然后我们这篇文章要做的就是说提交这个采购单. 当我们创建完成采购单,确定采购单不再修改,需要提交采购单,由监管单位进行审核. 我们在提交这个采购单 ...
- 02传智_jbpm与OA项目_部门模块
部门模块:具有增删改查(部门)的功能. Dao层的实现: 1,定义一个DepartmentDao.java. 定义基本的数据库操作.
- DEDECMS之十 修改织梦链和文章的默认来源及作者
今天在用织梦搭网站的时候,发现了两个问题,一个就是最新的dedecms5.7系统中默认会加上“织梦链”这一个链接组,织梦的做法是可以理解的, 但是给别人做网站,这些链接是不能要的,所以在数据库,模板文 ...