ZIP是一种很常见的压缩形式,在java中要实现ZIP的压缩主要用到的是java.util.zip这个包里面的类。
这个包里主要有ZipFile、 ZipOutputStream、ZipInputStream和ZipEntry这几个类。
ZipOutputStream是用来压缩文件 的,ZipInputStream和ZipFile是用来解压缩文件的,在压缩和解压缩的过程中,ZipEntry都会用到。在java的Zip压缩文件 中,每一个子文件都是一个ZipEntry对象。
来看这几个类:
1、 ZipOutputStream:
构造方法:
    ZipOutputStream(OutputStream out)   创建新的 ZIP 输出流。
常用方法:
void close()  关闭 ZIP 输出流和正在过滤的流。   
void putNextEntry(ZipEntry e) 开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处
void setComment(String comment) 设置 ZIP 文件注释。 
void write(byte[] b, int off, int len) 将字节数组写入当前 ZIP 条目数据。
2. ZipInputStream
构造方法:
    ZipInputStream(InputStream in)  创建新的 ZIP 输入流。
常用方法:
void close() 关闭此输入流并释放与此流关联的所有系统资源。  
ZipEntry getNextEntry() 读取下一个 ZIP 文件条目并将流定位到该条目数据的开始处。
int read(byte[] b, int off, int len) 从当前 ZIP 条目读入字节数组。
3.ZipFile(此类用于从 ZIP 文件读取条目。)
构造方法:
ZipFile(File file)
打开供阅读的 ZIP 文件,由指定的 File 对象给出。
ZipFile(File file, int mode)
打开新的 ZipFile 以使用指定模式从指定 File 对象读取。
ZipFile(String name)
打开 ZIP 文件进行阅读。

常用方法:
void close()
关闭 ZIP 文件。
Enumeration<? extends ZipEntry> entries()
          返回 ZIP 文件条目的枚举。
ZipEntry getEntry(String name)
返回指定名称的 ZIP 文件条目;如果未找到,则返回 null。
InputStream getInputStream(ZipEntry entry)
          返回输入流以读取指定 ZIP 文件条目的内容。
String getName()
返回 ZIP 文件的路径名。
int size()
返回 ZIP 文件中的条目数。

下面通过一个例子熟悉ZipFile类中几个常用方法的作用,关于ZipInputStream和ZipOutputStream的用法放在后面压缩解压缩测试中:
public static void ZipFileDemo(File zipFile) throws ZipException, IOException
{
ZipFile zf = new ZipFile(zipFile);//创建ZipFile对象
int size = zf.size();//返回ZIP 文件中的条目数
Enumeration<? extends ZipEntry> en = zf.entries();//枚举压缩文件中的条目数
System.out.println("压缩文件中包含以下文件:");
while(en.hasMoreElements())//遍历
{
ZipEntry zipEntry = en.nextElement();
System.out.println(zipEntry.getName());//输出压缩文件中每个条目的名称
}
System.out.println("ZIP 文件中的条目数,size = " + size);
System.out.println("压缩文件名:" + zf.getName());
} 

main方法中调用之:

ZipFileDemo(new File("f:\\demo.zip")); 
输出:
压缩文件中包含以下文件:
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
ZIP 文件中的条目数,size = 6
压缩文件名:f:\demo.zip

下面我们通过一个简单的例子实现压缩与解压缩的功能:

package zip;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipTest
{
public static void main(String[] args)
{
// TODO 自动生成的方法存根
try
{
zipSingleFile("f:\\data.zip",new File("f:\\demo\\data.mp3"));
freeSingleFile("f:\\data.zip");
}
catch (IOException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
//压缩单个文件
public static void zipSingleFile(String zipName,File file) throws IOException
{
BufferedInputStream bufi =
new BufferedInputStream(new FileInputStream(file));//创建输入流对象,用来读取文件内容
ZipOutputStream zo =
new ZipOutputStream(new FileOutputStream(new File(zipName)));//创建ZipOutputStream对象,用来压缩文件
ZipEntry ze = new ZipEntry(file.getName());//使用指定名称创建新的 ZIP条目
zo.putNextEntry(ze);//开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处。
int len = 0;
byte[] b = new byte[1024];
System.out.println("正在压缩....");
while((len = bufi.read(b)) != -1)
{
zo.write(b, 0, len);//将读取的字节数组写入压缩文件中
}
System.out.println("压缩完成!");
zo.close();
bufi.close();
}
public static void freeSingleFile(String zipName) throws ZipException, IOException
{
System.out.println("正在解压缩....");
ZipFile zf = new ZipFile(new File(zipName));//创建ZipFile对象
ZipInputStream zi = new ZipInputStream(new FileInputStream(zipName));//创建ZipInputStream对象,并绑定一个压缩文件
ZipEntry zipEntry = null;
while((zipEntry = zi.getNextEntry()) != null)//遍历压缩文件中的每个条目并操作之
{
String filename = zipEntry.getName();
File temp = new File("f:\\unpackTest\\" + filename);//创建一个File对象用来存放解压缩后的文件
if (! temp.getParentFile().exists()) //判断路径"f:\\unpackTest\\"是否存在,不存在就创建(默认不自动创建该目录)
temp.getParentFile().mkdirs();
OutputStream out = new FileOutputStream(temp);
InputStream in = zf.getInputStream(zipEntry);//返回输入流以读取指定 ZIP 文件条目的内容。
int len = 0;
byte[] buffer = new byte[1024];
while((len = in.read(buffer)) != -1)
{
out.write(buffer,0,len);//解压缩
}
out.close();
in.close();
System.out.println("解压缩文件成功...");
}
}
}

freeSingleFile方法也可以这样写(用枚举):

public static void freeSingleFile_2(String zipName) throws ZipException, IOException
{
System.out.println("正在解压缩....");
ZipFile zf = new ZipFile(new File(zipName));//创建ZipFile对象
Enumeration<? extends ZipEntry> en = zf.entries();
while(en.hasMoreElements())
{
ZipEntry ze = en.nextElement();
String filename = ze.getName();
File temp = new File("f:\\unpackTest\\" + filename);//创建一个File对象用来存放解压缩后的文件
if (! temp.getParentFile().exists()) //判断路径"f:\\unpackTest\\"是否存在,不存在就创建(默认不自动创建该目录)
temp.getParentFile().mkdirs();
OutputStream out = new FileOutputStream(temp);
InputStream in = zf.getInputStream(ze);//返回输入流以读取指定 ZIP 文件条目的内容。
int len = 0;
byte[] buffer = new byte[1024];
while((len = in.read(buffer)) != -1)
{
out.write(buffer,0,len);//解压缩
}
out.close();
in.close();
System.out.println("解压缩文件成功...");
}
}

假如一个文件夹中含有多个文件,怎样压缩呢?我们可以通过遍历文件的方式压缩每一个条目:

package zip;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Zips
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO 自动生成的方法存根
try
{
zip("f:\\data.zip",new File("f:\\demo"));
}
catch (IOException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static void zip(String zipName,File file) throws IOException
{
ZipOutputStream zo =
new ZipOutputStream(new FileOutputStream(new File(zipName)));//全局公用一个 ZipOutputStrea对象!
zip(zipName,file,zo);
zo.close();
}
public static void zip(String zipName, File file,ZipOutputStream zo)
throws IOException
{
if(!file.isDirectory())
{
BufferedInputStream bufi =
new BufferedInputStream(new FileInputStream(file));
ZipEntry ze = new ZipEntry(file.getName());
zo.putNextEntry(ze);// 开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处。
int len = 0;
byte[] b = new byte[1024];
System.out.println("正在压缩....");
while ((len = bufi.read(b)) != -1)
{
zo.write(b, 0, len);// 将读取的字节数组写入压缩文件中
}
System.out.println("压缩完成!");
zo.closeEntry();
}
else
{
File[] files = file.listFiles();//遍历
for(File fi : files)
{
zip(zipName,fi,zo);//递归调用
}
}
}
}
注意:
1.以上代码还很不完善,不能在实际项目中使用,仅仅是对java自带压缩的简单使用的介绍。
2.jdk自带压缩的api并不完美,存在中文不支持等问题,建议使用第三方的api,具体请google之。

java实现简单压缩与解压缩功能相关推荐

  1. java实现简单扫码登录功能(模仿微信网页版扫码)

    java实现简单扫码登录功能 模仿微信pc网页版扫码登录 使用js代码生成qrcode二维码减轻服务器压力 js循环请求服务端,判断是否qrcode被扫 二维码超时失效功能 二维码被扫成功登录,服务端 ...

  2. Java实现简单的登录注册功能

    登录注册在项目开发中是常用的功能需求,以下使用控制台实现一个简单的登录注册功能. 实体类: package com.csdn.entry;public class User {//实体类,对应一个表p ...

  3. Java案例:压缩与解压缩文件

    1.任务 (1)将单个文件压缩成一个zip文件 (2)将整个目录压缩成一个zip文件 (3)将zip压缩文件解压缩到指定目录 2.知识点

  4. Java实现简单注册登录等功能

    UserServlet层 package servlet;import dao.UserDao;import java.util.*;//作为方法入口 public class UserServlet ...

  5. Java代码简单模仿银行ATM功能

    1.首先要了解的是,这个ATM程序本身是一个简单,只为了完成一些ATM具备的一些方法,并非是真正完成一个ATM的全部功能和需求.(效果如下图) 1.这个下面演示的成功的功能: 2.这张图是输入错误的解 ...

  6. java在线打开xml文件_java实现简单解析XML文件功能示例

    本文实例讲述了java实现简单解析XML文件功能.分享给大家供大家参考,具体如下: package demo; import java.io.File; import java.io.IOExcept ...

  7. 表达式计算器 java代码_Java实现简单的表达式计算器功能示例

    本文实例讲述了Java实现简单的表达式计算器功能.分享给大家供大家参考,具体如下: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例 ...

  8. 基于C#的压缩与解压缩源码

    压缩是一种通过特定的算法来减小计算机文件大小的机制.这种机制是一种很方便的发明,尤其是对网络用户,因为它可以减小文件的字节总数,使文件能够通过较慢的互联网连接实现更快传输,此外还可以减少文件的磁盘占用 ...

  9. Python学习笔记(一)压缩与解压缩文件

    Python压缩与解压缩文件 Python能够直接处理zip文件中的数据,例如需要将对应目录或多文件打包或压缩成zip格式,或者需要查看一个zip格式的归档文件中部分或所有的文件同时避免将这些文件展开 ...

最新文章

  1. 【node】express的www.js文件里面的process.env.PORT
  2. python元类编程_python元类编程
  3. Spring Security构建Rest服务-0100-前言
  4. flyway java_flyway的使用
  5. 梅森增益matlab求解,梅森公式互不接触回路及其增益
  6. Linux如何从普通用户切换到root用户
  7. jquery ajax 跨域_Laravel 的跨域问题解决方案
  8. dup java_java web----TCP/DUP 通信
  9. Selenium 特点
  10. python爬虫什么意思-Python 爬虫是什么
  11. 微信小程序之----audio音频播放
  12. 软件加入使用时间_2020年,加入“midi音乐制作讲堂”内部会员,学音乐制作变得更简单...
  13. C++算法和数据结构之《二叉树》
  14. 世界杯ing~这不来个实时数据可视化?(结尾附源码)
  15. 1414. 和为 K 的最少斐波那契数字数目 贪心+递归 大年初三力扣是想意思意思一下呗~
  16. 常量指针(Pointer to const)与指针常量(Const pointer)
  17. 非全日制研究生-在职程序员提升的不错选择
  18. Android软件中嵌入地图之三:Google地图
  19. 关于STM32定时器中TI1FP1 与TI1FP2及相关话题
  20. OBJECTPROPERTY用法整理

热门文章

  1. 智能手机的中文输入法统计
  2. C++ 指向数组的指针
  3. GB(国标)字典大全
  4. c语言位置模拟,GPS模拟C语言.docx
  5. linux待机唤醒_Linux睡眠唤醒机制--Kernel态
  6. 开机后黑屏看不到桌面_电脑开机后桌面黑屏不显示怎么办
  7. 基于深度学习的语义匹配
  8. 【历史上的今天】4 月 12 日:Google 中文名称谷歌发布;Fire TV 问世;登上太空的计算器
  9. PHP 的命令行模式
  10. eclipse中向svn提交代码冲突的解决