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. MyEclipse中点击部署项目无响应(Deploy MyEclipse J2EE Project to Server)

    大部分情况下,只要找到当前的工作空间,删除其中一个文件就可以. 这个文件在Myeclipse工作.metadata\.plugins\org.eclipse.core.runtime\.setting ...

  2. MVC5 Api Area 区域

    到Area区分不同的模块让项目结构更加的清晰 TODO 步骤如下: 项目 –> 添加 -> 区域 (Area) 添加路由规则 public static class WebApiConfi ...

  3. js 异常判断

    /** * 预处理response * @param rep */ function validateRep(rep) { try{ if(rep.status==false){ layer.open ...

  4. http/ftp等的URL匹配正则表达式 ZT

    网上流传着多种匹配URL的正则表达式版本,但我经过试验,最好用的还是从stackoverflow上查到的: (https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_| ...

  5. 剑指Offer 8. 跳台阶 (递归)

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 题目地址 https://www.nowcoder.com/pract ...

  6. ORA-00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together

    群里有位兄弟,测试系统修改sga_lock=true参数后,重启库报错 ORA-00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot b ...

  7. 渲染标签 - v-text

    <!DOCTYPE html><html><head>    <meta charset="utf-8">    <title ...

  8. 安卓控制LED驱动编写

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 打开Android Stud ...

  9. 【DB2】SQL1585N 由于没有具有兼容页面大小的可用系统临时表空间,因此无法创建临时表。SQLSTATE=54048

    自己写了一段SQL,SQL中包含ORDER BY 字句,但是在执行的时候报错如下: 经过查询发现是由于临时表空间的PAGESIZE不够大,可考虑建16k或者32k PAGESIZE的表空间 示例如下: ...

  10. js有哪些变态的语法?

    JS这个语言好是好,但是很多时候写起来太丑了,每次看大牛的代码的时候,妈妈都问我为什么跪着读代码,随着 ES 2015的普及我们可以写出很多可读性强且漂亮的代码,那么接下来就带着大家一块学习一下可以把 ...