ZIP压缩输入/输出流

  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以及文件最后的存储目录baseSystem.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();//构建出出口,这里跳过了根目录,直接获得了下一个ZipEntrywhile((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.

                                                                          完.

    

posted on 2019-04-06 22:52 突突英雄 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/tutuhome/p/10663286.html

ZIP压缩输入/输出流相关推荐

  1. Java基础(二):集合、IO流(Zip压缩输入/输出流等)、File文件类、反射、枚举

    Java基础(一):编译和解释.数据类型.变量作用域.String常用方法.数组.面向对象.异常 Java基础(二):集合.IO流(Zip压缩输入/输出流等).File文件类.反射.枚举 Java异常 ...

  2. Java ZIP压缩输入输出流

    ZIP是一种较为常见的压缩形式,在Java中要想实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipFile.ZipOutputStream.ZipInputStream.Zi ...

  3. java zip压缩率为0_java中zip压缩输入输出流的问题,ZipEntry()方法里的参数到底什么意思...

    展开全部 ZipEntry 用于保存一些被压缩文件的信息,32313133353236313431303231363533e78988e69d8331333365643635如文件名,最后访问时间,最 ...

  4. 关于多线程生成Excel文件并压缩成ZIP(输入输出流形式非file创建)

    这几天因为创建Excel的性能问题,头疼了几天. 先说下我的需求:根据场次导出Excel,有多少个场次就有多少个sheet页.根据工具调试,发现创建WorkBook和Sheet真的很耗时,差不多要大约 ...

  5. Java Zip压缩实现(亲测)

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

  6. 使用GZIP和Zip压缩Java数据流

    转载自   使用GZIP和Zip压缩Java数据流 本文通过对数据压缩算法的简要介绍,然后以详细的示例演示了利用java.util.zip包实现数据的压缩与解压,并扩展到在网络传输方面如何应用java ...

  7. java zip压缩解压_JAVA实现实用的ZIP压缩与解压

    程序实现了ZIP压缩.共分为2部分 : 压缩(compression)与解压(decompression) 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压. ...

  8. Java基础知识每日总结(19)---Java输入输出流、文件、递归

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

  9. [Java]Swing窗体演示ZIP压缩流的压缩与解压

    最近开始学习java,然后学完了Swing和各种流后,试着写了个ZIP的压缩解压软件出来,具体代码如下: 压缩准备部分: String path = ja.getText();//获取文本域内容Str ...

  10. java 解压缩 工具类_Java实现的zip压缩及解压缩工具类示例

    本文实例讲述了Java实现的zip压缩及解压缩工具类.分享给大家供大家参考,具体如下: import java.io.BufferedInputStream; import java.io.Buffe ...

最新文章

  1. boost::pfr::tuple_element_t相关的测试程序
  2. 18道经典MySQL面试题,祝您升职加薪
  3. MONGODB 数据库文件读取的优化
  4. 正则表达式 - 去掉乱码字符/提取字符串中的中文字符/提取字符串中的大小写字母 - Python代码
  5. databus mysql搭建_databus bootstrap 部署
  6. 以算法岗为例:我最想对入职前的自己说些什么?
  7. selenium RC优化代码3
  8. Scala中的面向对象
  9. java 图片文字 乱码_关于java 向图片添加文字时的乱码问题
  10. 编程新手该如何调优程序?程序员必备性能调优利器——火焰图
  11. python学习dya4
  12. 开源无国界?你开源出去的代码, 可能有一天你自己都不能用了!
  13. Android商城开发----viewPager实现广告轮播(在首页Fragment中实现)
  14. 服务器更换硬盘同步数据过程中其他硬盘故障后修复过程
  15. 专利学习笔记4:权利要求书中的注意事项
  16. c语言vsprintf函数,vsprintf函数
  17. pdf 改变页面大小 python_在Python中使用PDF:阅读和拆分
  18. cpp map 获取所有 key_自动获取雷电模拟器窗口句柄
  19. 再不上市,斗鱼可能真的就凉了!
  20. Google Glass 初体验

热门文章

  1. JavaScript和HTML及CSS的通俗解释
  2. 基于C#语言的程序调用
  3. ios mk上传文件到服务器,ios – 使用预签名URL将文件上传到AWS S3的代码有什么问题?...
  4. mysql+update+@value_记一次MySQL更新语句update的踩坑
  5. java中的implements如何打开_Java 中extends与implements使用方法
  6. EditPlus安装及远程连接Linux
  7. SSH项目搭建-01-使用idea创建Maven工程
  8. 新场景 + 新应用,Flink 在机器学习领域的生产落地
  9. ora-12560:协议适配器错误
  10. 初识区块链【区块链01】