Java实现文件压缩与解压的示例[zip格式,gzip格式]

Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例。

zip扮演着归档和压缩两个角色;gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩。

Java I/O类库还收录了一些能读写压缩格式流的类。要想提供压缩功能,只要把它们包在已有的I/O类的外面就行了。这些类不是Reader和Writer,而是InputStream和OutStreamput的子类。这是因为压缩算法是针对byte而不是字符的。
相关类与接口:

Checksum 接口:被类Adler32和CRC32实现的接口

Adler32 :使用Alder32算法来计算Checksum数目

CRC32 :使用CRC32算法来计算Checksum数目

CheckedInputStream :InputStream派生类,可得到输入流的校验和Checksum,用于校验数据的完整性

CheckedOutputStream :OutputStream派生类,可得到输出流的校验和Checksum, 用于校验数据的完整性

DeflaterOutputStream :压缩类的基类。

ZipOutputStream :DeflaterOutputStream的一个子类,把数据压缩成Zip文件格式。

GZIPOutputStream :DeflaterOutputStream的一个子类,把数据压缩成GZip文件格式

InflaterInputStream :解压缩类的基类

ZipInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据

GZIPInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据

ZipEntry 类:表示 ZIP 文件条目

ZipFile 类:此类用于从 ZIP 文件读取条目

使用ZIP对多个文件进行压缩与解压

Java对Zip格式类库支持得比较全面,得用它可以把多个文件压缩成一个压缩包。这个类库使用的是标准Zip格式,所以能与很多的压缩工具兼容。

ZipOutputStream类有设置压缩方法以及在压缩方式下使用的压缩级别,zipOutputStream.setMethod(int method)设置用于条目的默认压缩方法。只要没有为单个 ZIP 文件条目指定压缩方法,就使用ZipOutputStream所设置的压缩方法来存储,默认值为 ZipOutputStream.DEFLATED(表示进行压缩存储),还可以设置成STORED(表示仅打包归档存储)。ZipOutputStream在设置了压缩方法为DEFLATED后,我们还可以进一步使用setLevel(int level)方法来设置压缩级别,压缩级别值为0-9共10个级别(值越大,表示压缩越利害),默认为Deflater.DEFAULT_COMPRESSION=-1。当然我们也可以通过条目ZipEntry的setMethod方法为单个条件设置压缩方法。

类ZipEntry描述了存储在ZIP文件中的压缩文件。类中包含有多种方法可以用来设置和获得ZIP条目的信息。类ZipEntry是被ZipFile[zipFile.getInputStream(ZipEntry entry)]和ZipInputStream使用来读取ZIP文件,ZipOutputStream来写入ZIP文件的。有以下这些有用的方法:getName()返回条目名称、isDirectory()如果为目录条目,则返回 true(目录条目定义为其名称以 ‘/' 结尾的条目)、setMethod(int method) 设置条目的压缩方法,可以为 ZipOutputStream.STORED 或 ZipOutputStream .DEFLATED。

下面实例我们使用了apache的zip工具包(所在包为ant.jar ),因为java类型自带的不支持中文路径,不过两者使用的方式是一样的,只是apache压缩工具多了设置编码方式的接口,其他基本上是一样的。另外,如果使用org.apache.tools.zip.ZipOutputStream来压缩的话,我们只能使用org.apache.tools.zip.ZipEntry来解压,而不能使用java.util.zip.ZipInputStream来解压读取了,当然apache并未提供ZipInputStream类。

文件压缩:

package gizAction;
import java.io.*;
import java.util.zip.*;
/**
 * @author Dana·Li
 * <p>
 * 程序实现了ZIP压缩[compression]
 * <p>
 * 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。
 * <p>
 * 在本段代码中,实现的是压缩部分
 */
public class ZipCompressing {
 private int k = 1; // 定义递归次数变量

 private void zip(String zipFileName, File inputFile) throws Exception {
  System.out.println("压缩中...");
  ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
  BufferedOutputStream bo = new BufferedOutputStream(out);
  zip(out, inputFile, inputFile.getName(), bo);
  bo.close();
  out.close(); // 输出流关闭
  System.out.println("压缩完成");
 }
 private void zip(ZipOutputStream out, File f, String base,
   BufferedOutputStream bo) throws Exception { // 方法重载
  if (f.isDirectory()){
   File[] fl = f.listFiles();
   if (fl.length == 0){
    out.putNextEntry(new ZipEntry(base + "/")); // 创建zip压缩进入点base
    System.out.println(base + "/");
   }
   for (int i = 0; i < fl.length; i++) {
    zip(out, fl[i], base + "/" + fl[i].getName(), bo); // 递归遍历子文件夹
   }
   System.out.println("第" + k + "次递归");
   k++;
  } else {
   out.putNextEntry(new ZipEntry(base)); // 创建zip压缩进入点base
   System.out.println(base);
   FileInputStream in = new FileInputStream(f);
   BufferedInputStream bi = new BufferedInputStream(in);
   int b;
   while ((b = bi.read()) != -1) {
    bo.write(b); // 将字节流写入当前zip目录
   }
   bi.close();
   in.close(); // 输入流关闭
  }
 }
 /**
  * 测试
  * @param args
  */
 public static void main(String[] args) {
  ZipCompressing book = new ZipCompressing();
  try {
   book.zip("F:\\ziptest.zip",new File("F:\\ziptest"));
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

文件解压:

package gizAction;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
 * @author Dana·Li
 * <p>
 * 程序实现了ZIP解压[decompression]
 * <p>
 * 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。
 * <p>
 * 在本段代码中,实现的是解压部分;
 */
public class zipDecompressing { 

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  long startTime=System.currentTimeMillis();
  try {
   ZipInputStream Zin=new ZipInputStream(new FileInputStream(
     "F:\\ziptest.zip"));//输入源zip路径
   BufferedInputStream Bin=new BufferedInputStream(Zin);
   String Parent="F:\\ziptest\\"; //输出路径(文件夹目录)
   File Fout=null;
   ZipEntry entry;
   try {
    while((entry = Zin.getNextEntry())!=null && !entry.isDirectory()){
     Fout=new File(Parent,entry.getName());
     if(!Fout.exists()){
      (new File(Fout.getParent())).mkdirs();
     }
     FileOutputStream out=new FileOutputStream(Fout);
     BufferedOutputStream Bout=new BufferedOutputStream(out);
     int b;
     while((b=Bin.read())!=-1){
      Bout.write(b);
     }
     Bout.close();
     out.close();
     System.out.println(Fout+"解压成功");
    }
    Bin.close();
    Zin.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
  long endTime=System.currentTimeMillis();
  System.out.println("耗费时间: "+(endTime-startTime)+" ms");
 } 

}

用GZIP进行对单个文件压缩

GZIP的接口比较简单,因此如果你只需对一个流进行压缩的话,可以使用它。当然它可以压缩字符流,与可以压缩字节流,下面是一个对GBK编码格式的文本文件进行压缩的。

压缩类的用法非常简单;只要用GZIPOutputStream 或ZipOutputStream把输出流包起来,再用GZIPInputStream 或ZipInputStream把输入流包起来就行了。剩下的都是些普通的I/O操作。

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class GZIPcompress {
 public static void main(String[] args) throws IOException {
  //做准备压缩一个字符文件,注,这里的字符文件要是GBK编码方式的
  BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(
    "e:/tmp/source.txt"), "GBK"));
  //使用GZIPOutputStream包装OutputStream流,使其具体压缩特性,最后会生成test.txt.gz压缩包
  //并且里面有一个名为test.txt的文件
  BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(
    new FileOutputStream("test.txt.gz")));
  System.out.println("开始写压缩文件...");
  int c;
  while ((c = in.read()) != -1) {

   /*
    * 注,这里是压缩一个字符文件,前面是以字符流来读的,不能直接存入c,因为c已是Unicode
    * 码,这样会丢掉信息的(当然本身编码格式就不对),所以这里要以GBK来解后再存入。
    */
   out.write(String.valueOf((char) c).getBytes("GBK"));
  }
  in.close();
  out.close();
  System.out.println("开始读压缩文件...");
  //使用GZIPInputStream包装InputStream流,使其具有解压特性
  BufferedReader in2 = new BufferedReader(new InputStreamReader(
    new GZIPInputStream(new FileInputStream("test.txt.gz")), "GBK"));
  String s;
  //读取压缩文件里的内容
  while ((s = in2.readLine()) != null) {
   System.out.println(s);
  }
  in2.close();
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-01-04

java 压缩和解压缩Zip、Jar、Gzip文件实例代码

我们经常会使用WinZIP等压缩软件将文件进行压缩以方便传输.在java里面也提供了将文件进行压缩以减少传输时的数据量的类,可以很方便的将文件压缩成ZIP.JAR.GZIP等形式,GZIP主要是在Linux系统下的压缩文件. 下面主要讲的就是ZIP形式的压缩文件,而JAR.GZIP形式的压缩文件也是类似的用法. ZIP是一种很常见的压缩形式,在java中要实现ZIP的压缩主要用到的是java.util.zip这个包里面的类.主要有ZipFile. ZipOutputStream.ZipInput

Java中如何调用cmd压缩文件

今天在做一个java调用windows的压缩命令时遇到一奇怪问题代码如下: 复制代码 代码如下: String cmd ="C:/Program Files (x86)/WinRAR/rar.exe a c:/test.rar c:/test.log"; //System.out.println(cmd);Process proc = Runtime.getRuntime().exec(cmd); 以上代码在Xp,win7,windows server2003执行完全正常发现将代码转移

java压缩多个文件并且返回流示例

这个类可以压缩多个文件并且返回流,在程序中可以再操作返回的流做其它功能,比如验证MD5,下面看代码吧 复制代码 代码如下: /*** 方法描述:<b>测试类</b></br>*/public class TestFileStream{ //文件和压缩包存储的位置StringtempFilePath="C:/temp/"List<String>fileList=newArrayList<String>();fileList.ad

Java实现多文件压缩打包的方法

本文实例讲述了Java实现多文件压缩打包的方法.分享给大家供大家参考,具体如下: package com.biao.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.u

Java压缩文件ZIP实例代码

提示:java.util.zipoutputstream java API压缩为zip文件 代码: 复制代码 代码如下: package com.gaoqi.test;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.ZipOu

Java创建ZIP压缩文件的方法

本文实例讲述了Java创建ZIP压缩文件的方法.分享给大家供大家参考.具体如下: 这里注意:建议使用org.apache.tools.zip.*包下相关类,否则可能会出现中文乱码问题. /** * 压缩文件夹 * @param sourceDIR 文件夹名称(包含路径) * @param targetZipFile 生成zip文件名 * @author liuxiangwei */ public static void zipDIR(String sourceDIR, String target

实例展示使用Java压缩和解压缩7z文件的方法

压缩为7z文件 首先网络上对7z的压缩内容很少. 尤其是java调用进行压缩的是更少了. 一下是自己完成的一个压缩. 本人进行了测试是成功的. 将压缩的流写如磁盘一个压缩文件中. 然后使用7z的压缩软件进行打开解压. 7-zip的开源项目7-zip-JBinding项目地址(sourceforge) 不多说,调用7z源码进行压缩的方法如下. public byte[] lzmaZip(String xml) throws IOException{ BufferedInputStream inSt

java生成压缩文件示例代码

代码: 复制代码 代码如下: import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream; import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipOutputStream; /**  * @project: Test  * @author

Java操作Ant压缩和解压文件及批量打包Anroid应用

实现zip/tar的压缩与解压 java中实际是提供了对  zip等压缩格式的支持,但是为什么这里会用到ant呢? 原因主要有两个: 1. java提供的类对于包括有中文字符的路径,文件名支持不够好,你用其它第三方软件解压的时候就会存在乱码.而ant.jar就支持文件名或者路径包括中文字符. 2. ant.jar提供了强大的工具类,更加方便于我们对压缩与解压的操作. 注意事项: 1. 首先说明一下,关于皮肤或者类似于皮肤的Zip包,实际上公司可能会根据自己的规定或需求,自定义压缩包文件的结尾,实

java压缩zip文件中文乱码问题解决方法

通常用java来打包文件生成压缩文件后,有如下两个地方会出现乱码 : 1.内容的中文乱码问题,这个问题网上很多人给出了解决方法,主要有两种方法:一是修改sun的源码:另一个是使用开源的类库org.apache.tools.zip.ZipOutputStream和org.apache.tools.zip.ZipEntry,这两个类ant.jar中有,可以直接下载使用即可,毫无疑问,选择后者更方便 2.压缩文件注释的中文乱码问题:zos.setComment("中文测试");这个问题网上对

Java解压缩zip - 解压缩多个文件或文件夹实例

Java解压缩zip - 多个文件(包括文件夹),具体如下: 对多个文件和文件夹进行压缩,对复杂的文件目录进行解压. 压缩方法使用的是可变参数,可以压缩1到多个文件..可以写数组的方式或者一个个写到参数列表里面... ZipFiles(zip,"abc",new File("d:/English"),new File("d:/发放数据.xls")); 测试文件目录结构: 测试的压缩内容:English文件夹和同级的两个excel文件 File[]

使用Java生成jpg与压缩图片为jpg文件的代码示例

Java生成jpg格式图片: package other.pic; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile; import java.awt.imag

java使用gzip实现文件解压缩示例

复制代码 代码如下: package com.cjonline.foundation.cpe.action; import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.

java导出json格式文件的示例代码

本文介绍了java导出json格式文件的示例代码,分享给大家,具体如下: 生成json文件代码: import java.io.File; import java.io.FileWriter; import java.io.Writer; public class CreateFileUtil { /** * 生成.json格式文件 */ public static boolean createJsonFile(String jsonString, String filePath, String

java使用WatchService监控文件夹示例

通过java7提供的WatchService API 实现对文件夹的监控 package service; import config.Config; import java.io.IOException; import java.nio.file.*; import java.util.List; import java.util.concurrent.TimeUnit; public class WatchDirService { private WatchService watchServ

java使用nio2拷贝文件的示例

这个程序只是为了更方便的进行拷贝文件(夹)而创造.1.可以不用新建文件夹,就像windows的复制粘贴一样简单.2.有简单的出错重连机制3.不需要重复拷贝,差异化复制文件.4.拷贝文件夹的时候可以不用复制全路径,只关注需要拷贝的文件夹.5.程序做了简单的必要检查,效率也不算低.6.使用的是7的nio2的新API. 复制代码 代码如下: import java.io.IOException;import java.nio.file.FileVisitResult;import java.nio.f

java实现倒序读取文件功能示例分享

Long end,long num,File file,String charset4个参数说明end 相当于坐标 ,tail 向上的起点,num是读取的行数,file 目标文件 charset字符集 默认UTF8end 为 null 代表从 文件 最末端 向上 获取. Map m=FileUtil.tail(null,10,file,null)//读取文件最后10行,结果在 m.get(FileUtil.ARR) 里FileUtil.tail(m.get(FileUtil.POINT),3,f

java通过url读取文件内容示例

复制代码 代码如下: using System;  using System.Collections;  using System.ComponentModel;  using System.Data;  using System.Drawing;  using System.Web;  using System.Web.SessionState;  using System.Web.UI;  using System.Web.UI.WebControls;  using System.Web.

Java实现自动压缩文件并加密的方法示例

本文实例讲述了Java实现自动压缩文件并加密的方法.分享给大家供大家参考,具体如下: 实现功能:自动压缩并加密 /** * * @Title: zipFilesAndEncrypt * @Description: 将指定路径下的文件压缩至指定zip文件,并以指定密码加密,若密码为空,则不进行加密保护 * @param srcFileName 待压缩文件路径 * @param zipFileName zip文件名 * @param password 加密密码 * @return * @throws

Java GZIP压缩与解压缩代码实例

这篇文章主要介绍了Java GZIP压缩与解压缩代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.GZIP压缩 public static byte[] compress(String str, String encoding) { if (str == null || str.length() == 0) { return null; } ByteArrayOutputStream out = new ByteArrayOutput

Java编程利用socket多线程访问服务器文件代码示例

这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码. 接下来进入正文,我们看看利用socket多线程访问服务器代码: ServerMain.java package com.ysk.webServer; import java.io.File; import java.io.IOException; import java.net.ServerSoc

java IO流将一个文件拆分为多个子文件代码示例

文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位,对文件进行分割或合并. 看下基本思路: 如果有一个大文件,指定分割大小后(比如:按1M切割) step 1: 先根据原始文件大小.分割大小,算出最终分割的小文件数N step 2: 在磁盘上创建这N个小文件 step 3: 开多个线程(线程数=分割文件数),每个线程里,利用RandomAccessF