ZIP是压缩文件的格式,使用ZIP可以节省空间

  java将压缩/解压缩文件的方法都封装在java.util.zip包下,java实现了I/O数据流和网络数据流的单一接口,所以实现起来比较容易。

  主要的一些方法有:ZipOutputStram,ZipIutputStram,ZipEntry.

  以下实现ZIP压缩:

  首先了解ZipOutputStream类,利用这个类可以将文件压缩,主要的方法有:

  1. putNextEntry(ZipEntry e):开始编写新的ZIP条目,并且将流定位到条目的开头。Entry方法的作用就是可以让文件从这个入口进入ZIP中
  2. 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压缩输入/输出流的更多相关文章

  1. ZIP压缩输入/输出

    学习内容: 一.压缩文件 1.利用ZipOutputStream类对象,可将文件压缩. 2.ZipOutputStream类构造方法:ZipOutputStream(OutputStream out) ...

  2. Java Zip压缩实现

    最近在自学javaWeb,先复习一下java,把还给老师的东西再找回来(知识如果不用很快就会忘记啊).. 今天看到了zip压缩,决定要整理一下. java将有关zip压缩的内容都封装在java.uti ...

  3. I/O输入输出流

    I/O(输入/输出) 在变量.数组和对象中存储的数据是暂时存在的,程序结束后它们就会消失.为了能够永久地保存创建的数据,需要将其保存在磁盘文件中,这样可以在其他程序中使用它们. Java的I/O技术可 ...

  4. zip压缩与解压文件夹或文件

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import ...

  5. 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 重点: 实现多级子目录的压缩, ...

  6. zip 压缩文件夹

    import java.io.*; import java.util.zip.*; /** * @author Dana·Li * <p> * 程序实现了ZIP压缩[compression ...

  7. java 3 接口与多态&输入输出流

    接口 中的所有方法都是方法 抽象 使用接口实现多继承 类型的装换 数据成员就变成了static 和 final food 和 snow 都是可以吃的 可以同时实现多个接口 接口与接口之间也可以有继承关 ...

  8. 【VC++技术杂谈008】使用zlib解压zip压缩文件

    最近因为项目的需要,要对zip压缩文件进行批量解压.在网上查阅了相关的资料后,最终使用zlib开源库实现了该功能.本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解 ...

  9. Java 输入输出流 转载

    转载自:http://blog.csdn.net/hguisu/article/details/7418161 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所 ...

随机推荐

  1. C++ 常用设计模式(学习笔记)

    1.工厂模式:简单工厂模式.工厂方法模式.抽象工厂模式 1).简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类. typedef enum { T80 ...

  2. Hbuilder护眼主题分享

    sublime还有webstorm有很多主题,但是Hbuilder就相对较少,或者直接说基本没什么主题,在网上搜索了很久也很少有Hbuilder的主题分享,于是就自己取色调了一个仿的护眼主题来分享一下 ...

  3. React Native Android打包apk

    按照官方的5步曲: 1.在终端里面,cd 到项目的根目录后.执行下面这行命令: keytool -genkey -v -keystore my-release-key.keystore -alias ...

  4. AFN\HTTPS\UIWebView

    1.AFN使用技巧 1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,再控制器中真正发请求的代码使用自己封装的工具类. 2.这样做的优点是以后如果修改了底层依赖的框架,那么我们修改 ...

  5. python 实现快速排序和插入排序

    def quick_sort(data): if len(data)<2 or (len(data)==2 and data[0]<=data[1]): #[2,3]此情况会死循环 所以加 ...

  6. sqlite数据库操作

    1.创建表 import sqlite3 conn = sqlite3.connect('C:\\Users\\Kuma\\Desktop\\spider.db') print('connect su ...

  7. es6学习日记4

    数组的扩展 扩展运算符是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // 1 2 3 console.l ...

  8. Python全栈之路----常用模块----os模块

    os模块提供了很多允许你的程序和操作系统直接交互的功能 得到当前工作目录,即当前Python脚本工作的目录路径:os.getcwd() #test.py import os print(os.getc ...

  9. sql server中case when的用法

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...

  10. day05 集合

    今日进度(数据类型) 集合 内存相关 深浅拷贝 1.集合表示 1.无序 2.不重复 3.hash查找 #问题:v={}表示? set: v1=set()#空集合 v1={1,2,3,4,5} dict ...