ZIP压缩输入/输出流
ZIP是压缩文件的格式,使用ZIP可以节省空间
java将压缩/解压缩文件的方法都封装在java.util.zip包下,java实现了I/O数据流和网络数据流的单一接口,所以实现起来比较容易。
主要的一些方法有:ZipOutputStram,ZipIutputStram,ZipEntry.
以下实现ZIP压缩:
首先了解ZipOutputStream类,利用这个类可以将文件压缩,主要的方法有:
- putNextEntry(ZipEntry e):开始编写新的ZIP条目,并且将流定位到条目的开头。Entry方法的作用就是可以让文件从这个入口进入ZIP中
- write(byte[] b,int off,int len):将字节数组写入到当前的ZIP条目下
public class MyZip {
private void zip(String ZipFileName,File inputFile) throws IOException {//创建zip方法,其中的参数ZipFileName是压缩后文件,inputFile要压缩的文件。
ZipOutputStream out=new ZipOutputStream(new FileOutputStream(ZipFileName));//创建了输出流,这里ZipOutputStream()的参数是FileOutPutStream的原因是因为ZIP压缩的对象是文件。
zip(out,inputFile,"");//调用zip方法,实现了zip的重载。这次的参数是本方法中定义过的输出流out,要压缩的文件:inputFile以及文件最后的存储目录base
System.out.println("压缩中....");
out.close();
}
private void zip(ZipOutputStream out,File f,String base) throws IOException {//方法重载
if(f.isDirectory()) {//判断要压缩的文件是否是文件夹
File[] fl=f.listFiles();//如果是文件夹就对把该文件夹中的文件的路径以文件数组的形式获得
if(base.length()!=0) {//判断最后要存储的路径是否已存在
out.putNextEntry(new ZipEntry(base+"/"));//如果已经存在,写入此目录的entry
}
for(int i=0;i<fl.length;i++) {//遍历文件数组
zip(out,fl[i],base+fl[i]);//将文件数组中的文件添加到已经创建的ZIP中。
}
}else {
out.putNextEntry(new ZipEntry(base));//如果base为空。那么就创建新的进入点
//创建FileInputStream对象
FileInputStream in=new FileInputStream(f);//创建该输入流的原因是为了后边判断该流是否到达尾部
int b;
System.out.println(base);
while((b=in.read())!=-1) {
out.write(b);//在没有到达尾部的情况下向已经创建的ZIP中添加
}
in.close();//关闭流
}
}
public static void main(String[] args) throws IOException {
MyZip book=new MyZip();
book.zip("E:/hello.zip",new File("E:/hello"));
System.out.println("压缩完成");
}
}
在走完整个流程之后,我弄明白了程序究竟是如何将文件压缩起来的。重点就在
ZipOutputStream out=new ZipOutputStream(new FileOutputStream(ZipFileName));
这里定义输出流的同时,声明了ZipFileName,我们之前提到过ZipFileName是压缩后的文件,程序在这里使用FileOutputStream(ZipFileName)直接创建了一个zip文件,
这样一来之后的添加压缩文件就遍历要压缩的目录将其中的文件添加到ZIP中。但是可以这样添加的前提是在使用Entry方法的前提下,要不然Entry方法存在就毫无意义。
解压缩:
解压缩中主要用到的类是ZipInputStream.该类可以读取ZIP压缩格式的文件,包括已压缩的和未压缩的条目。构造方法是ZipInputStream(InputStream in)
以下解压代码是基于以上压缩代码基础而来:
public class Decompressing {//创建解压类
public static void main(String[] args) {
File file=new File("E:\\hello.zip");//需要被解压的文件
ZipInputStream zin;//创建ZinInputStream对象
try {
ZipFile zipfile=new ZipFile(file);//创建压缩文件对象
zin=new ZipInputStream(new FileInputStream(file));//将要被压缩的文件对象放入zipInputStream中
ZipEntry entry=zin.getNextEntry();//构建出出口,这里跳过了根目录,直接获得了下一个ZipEntry
while((entry=zin.getNextEntry())!=null&&!entry.isDirectory()) {//判断entry是否为空,是否是文件夹
File tmp=new File(entry.getName());//输出文件路径
System.out.println(entry.getName());
if(!tmp.exists()) {//如果文件不存在
tmp.getParentFile().mkdirs();//创建文件父类文件夹路径
OutputStream os=new FileOutputStream(tmp);//将文件目录中的文件放入输出流中,用输出流读取压缩文件中指定目录的文件
InputStream in=zipfile.getInputStream(entry);
int count=0;
while((count=in.read())!=-1) {//如有输入流可以读取到数值
os.write(count);//输出流写入
}
os.close();
in.close();
}
zin.closeEntry();
System.out.println(entry.getName()+"解压成功");
}
zin.close();
} catch (ZipException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
本实例是通过ZipEntry类的getName()方法得知此文件的全称(含path),借此来决定压缩之后的目录和文件名,使用ZipInputStream类来解压文件,必须先使用ZipInputStream类的getNextEntry()方法来取得其内第一个ZipEntry.
完.
ZIP压缩输入/输出流的更多相关文章
- ZIP压缩输入/输出
学习内容: 一.压缩文件 1.利用ZipOutputStream类对象,可将文件压缩. 2.ZipOutputStream类构造方法:ZipOutputStream(OutputStream out) ...
- Java Zip压缩实现
最近在自学javaWeb,先复习一下java,把还给老师的东西再找回来(知识如果不用很快就会忘记啊).. 今天看到了zip压缩,决定要整理一下. java将有关zip压缩的内容都封装在java.uti ...
- I/O输入输出流
I/O(输入/输出) 在变量.数组和对象中存储的数据是暂时存在的,程序结束后它们就会消失.为了能够永久地保存创建的数据,需要将其保存在磁盘文件中,这样可以在其他程序中使用它们. Java的I/O技术可 ...
- zip压缩与解压文件夹或文件
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import ...
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
- zip 压缩文件夹
import java.io.*; import java.util.zip.*; /** * @author Dana·Li * <p> * 程序实现了ZIP压缩[compression ...
- java 3 接口与多态&输入输出流
接口 中的所有方法都是方法 抽象 使用接口实现多继承 类型的装换 数据成员就变成了static 和 final food 和 snow 都是可以吃的 可以同时实现多个接口 接口与接口之间也可以有继承关 ...
- 【VC++技术杂谈008】使用zlib解压zip压缩文件
最近因为项目的需要,要对zip压缩文件进行批量解压.在网上查阅了相关的资料后,最终使用zlib开源库实现了该功能.本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解 ...
- Java 输入输出流 转载
转载自:http://blog.csdn.net/hguisu/article/details/7418161 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所 ...
随机推荐
- 第一个java程序中文乱码以及如何解决
出现问题:编码gbk的不可映射字段 原因:.java文件的编码与cmd命令执行器使用的编码不一致 我们使用的.java文件的编码为UTF-8 Cmd默认使用的编码为GBK: 解决方式统一编码: 方法1 ...
- 2017年3月30日15:00:19 fq以后的以后 动态代理
代理与继承,组合不同的是,继承是继承父类特性,组合是拼装组合类的特性,代理是使用代理类的指定方法并可以做自定义. 静态类是应用单个类,当代理的类数量较多时可用动态代理,动态代理在概念上很好理解 htt ...
- restful规范整理
restful的十条规范 restful一共有十条规范,但其并不是规定.可以不去遵守,是一种软件风格 1.API与客户端交互,通常使用https协议 2.域名:https://api.baidu.co ...
- mail语法
在Linux系统下mail命令的用法 在Linux系统下mail命令的测试 1. 最简单的一个例子: mail -s test admin@aispider.com 这条命令的结果是发一封标题为tes ...
- canvas 绘画随机点
直接看图吧: 这样的随机点,是小圆点组成的,然后一直在动,记录一下,万一以后要用到呢: canvas的具体设置我就不写了,另一篇文档里有: drawRandomDot () { let leftCan ...
- 关于http协议的一些笔记
1.正向代理和反向代理正向代理相当于客户端向代理发送服务器,代理将请求发给服务器,一般代理跟客户端有关系,没有查找的功能:反向代理作用于服务端,客户端向服务器代理发送请求,服务器代理去找需要的资源,然 ...
- python学习之路04——列表和字典
列表和字典 python中的可变数据类型有:列表和字典 不可变类型:数字,字符串,元组 今天先讲列表和字典 一.列表 1.概念: 变量:使用变量存储数据,但是,变量存储数据每次只能存储一个数据 问题: ...
- cs特征性以及数据库的连接
笔记c3 五大浏览器内核: Ie浏览器:-ms 火狐:-moz Safari以及chorme:-webkit 欧朋:-o Word-wrap:break-word;设置换行. Border borde ...
- PHP is_writeable 存在bug , 写一个自定函数 判断文件是否可写
$is_w = function($file){ if(DIRECTORY_SEPARATOR == '/' and @ini_get('safe_mode')==false){ return is_ ...
- 数组排序自定义comparator()
案例1:现在有一个普通数组arr = [3,1,2,4,5,6,8,0,1]; 自定义一个排序方法: function createComparator(){ return function (obj ...