`

Java ZIP文件压缩与解压缩

ZIP 
阅读更多

转:http://www.189works.com/article-18606-1.html

 

最近需要用到Java的zip文件压缩与解压缩,找了一堆的资料和参考代码,没有一个能够很好的解决问题。要不就是压缩出错,要不就是压缩后的文件目录组织不正确,要不就是中文乱码,总之问题一大堆。没办法只能自己编码搞定。
  java里面有个包叫java.util.zip提供zip文件压缩,但是编码的时候非常不方便。编码量太多了,通过搜索,发现apache有个包提供一些简单的方法来实现zip文件的压缩与解压缩<http://ant.apache.org/ >。下载地址:org.apache.tools.zip <http://ant.apache.org/bindownload.cgi >
  下载下来解压缩后,该包中的ant.jar里面提供了zip文件压缩与解压缩的功能代码。在项目中引用该类库。
  要压缩成zip文件,涉及到的问题如下:
  1.将要压缩的文件添加到zip文件包中。
  2.组织好要压缩的文件目录与压缩后的zip文件目录一致。
  3.文件名以及文件夹名中文字符编码。
  4.解压缩zip文件,并将解压缩后的文件及文件夹的组织形式要与压缩前的一致。
  在设计该类的时候,我编写了一下几个方法:
  第一个zip方法,将来填入要压缩的文件或文件夹路径,然后压缩成zip文件并保存到指定位置。代码如下:
  1 /**
  2  * 压缩文件或者文件夹 压缩采用gb2312编码,其它编码方式可能造成文件名与文件夹名使用中文的情况下压缩后为乱码。。。
  3  *
  4 * @param source
  5  *            要压缩的文件或者文件夹
  6 *            建议使用"c:/abc"或者"c:/abc/aaa.txt"这种形式来给定压缩路径
  7  *            使用"c:\\abc" 或者"c:\\abc\\aaa.txt"这种形式来给定路径的话,可能导致出现压缩和解压缩路径意外故障。。。
  8  * @param zipFileName
  9  *            压缩后的zip文件名称 压缩后的目录组织与windows的zip压缩的目录组织相同。
  10  *            会根据压缩的目录的名称,在压缩文件夹中创建一个改名的根目录, 其它压缩的文件和文件夹都在该目录下依照原来的文件目录组织形式
  11  * @throws IOException
  12  *             压缩文件的过程中可能会抛出IO异常,请自行处理该异常。
  13  */
  14  public static void ZIP(String source, String zipFileName)
  15         throws IOException {
  16     ZipOutputStream zos = new ZipOutputStream(new File(zipFileName));
  17
  18     // 设置压缩的时候文件名编码为gb2312
  19     zos.setEncoding("gb2312");
  20     // System.out.println(zos.getEncoding());
  21
  22     File f = new File(source);
  23
  24     if (f.isDirectory()) {
  25         // 如果直接压缩文件夹
  26         ZIPDIR(source, zos, f.getName() + "/");// 此处使用/来表示目录,如果使用\\来表示目录的话,会导致压缩后的文件目录组织形式在解压缩的时候不能正确识别。
  27     } else {
  28         // 如果直接压缩文件
  29         ZIPDIR(f.getPath(), zos, new File(f.getParent()).getName() + "/");
  30         ZIPFile(f.getPath(), zos, new File(f.getParent()).getName() + "/"
  31                 + f.getName());
  32     }
  33
  34     zos.closeEntry();
  35     zos.close();
  36 }
  为了很好的解决中文编码问题,这里在创建ZipOutputStream 输出流的时候就指定其编码为gb2312,这样无论将来是中文的文件名和文件夹,都可以被正确的识别,不会出现乱码的情况。
  特别提醒大家注意的是,文件的路径使用的斜杠最好是"/",如果用"\\"来表示路径的话,表面上看这是区分好了文件夹,其实在解压缩的时候zipfile对象就不能很好的识别其为文件夹,有可能将其识别为文件,导致解压出错。这里是个关键点!
  第二个ZIPFile方法,专门将指定的文件压缩成为zip文件的方法。代码如下:
  1 /**
  2  * zip 压缩单个文件。 除非有特殊需要,否则请调用ZIP方法来压缩文件!
  3  *
  4 * @param sourceFileName
  5  *            要压缩的原文件
  6  * @param zipFileName
  7  *            压缩后的文件名
  8  * @param zipFileName
  9  *            压缩后的文件名
  10  * @throws IOException
  11  *             抛出文件异常
  12  */
  13 public static void ZIPFile(String sourceFileName, ZipOutputStream zos,
  14         String tager) throws IOException {
  15     // System.out.println(tager);
  16     ZipEntry ze = new ZipEntry(tager);
  17     zos.putNextEntry(ze);
  18
  19     // 读取要压缩文件并将其添加到压缩文件中
  20     FileInputStream fis = new FileInputStream(new File(sourceFileName));
  21     byte[] bf = new byte[2048];
  22     int location = 0;
  23     while ((location = fis.read(bf)) != -1) {
  24         zos.write(bf, 0, location);
  25     }
  26     fis.close();
  27 }
  说明:这里写入zip文件流的时候使用了缓存,如果不使用将导致压缩的时间过长。。。(每次从硬盘读取一个字节并写入到zip文件流中,加重了硬盘的负担。。。)
  经过我的机器测试,这个缓存设置1024与2048没有太多的性能差别,但是小于1024后就有较大的区别了。所以建议设置为1024或者2048。
  第三个ZIPDIR方法,专门在ZIP文件中添加文件夹的方法。代码如下:
  1 /**
  2  * 压缩目录。 除非有特殊需要,否则请调用ZIP方法来压缩文件!
  3  *
  4 * @param sourceDir
  5  *            需要压缩的目录位置
  6  * @param zos
  7  *            压缩到的zip文件
  8  * @param tager
  9  *            压缩到的目标位置
  10  * @throws IOException
  11  *             压缩文件的过程中可能会抛出IO异常,请自行处理该异常。
  12  */
  13 public static void ZIPDIR(String sourceDir, ZipOutputStream zos,
  14         String tager) throws IOException {
  15     // System.out.println(tager);
  16     ZipEntry ze = new ZipEntry(tager);
  17     zos.putNextEntry(ze);
  18     // 提取要压缩的文件夹中的所有文件
  19     File f = new File(sourceDir);
  20     File[] flist = f.listFiles();
  21     if (flist != null) {
  22         // 如果该文件夹下有文件则提取所有的文件进行压缩
  23         for (File fsub : flist) {
  24             if (fsub.isDirectory()) {
  25                 // 如果是目录则进行目录压缩
  26                 ZIPDIR(fsub.getPath(), zos, tager + fsub.getName() + "/");
  27             } else {
  28                 // 如果是文件,则进行文件压缩
  29                 ZIPFile(fsub.getPath(), zos, tager + fsub.getName());
  30             }
  31         }
  32     }
  33 }
  说明:这里使用了递归的方式来读取要压缩的文件夹中的下级文件夹,全部将其压到zip文件中,用来组织好将来压缩好的zip文件里面的目录形式。
  第四个UnZip方法,专门用于解压缩zip文件的方法。代码如下:
  1 /**
  2  * 解压缩zip文件
  3  *
  4 * @param sourceFileName
  5  *            要解压缩的zip文件
  6  * @param desDir
  7  *            解压缩到的目录
  8  * @throws IOException
  9  *             压缩文件的过程中可能会抛出IO异常,请自行处理该异常。
  10  */
  11 public static void UnZIP(String sourceFileName, String desDir)
  12         throws IOException {
  13     // 创建压缩文件对象
  14     ZipFile zf = new ZipFile(new File(sourceFileName));
  15
  16     // 获取压缩文件中的文件枚举
  17     Enumeration<ZipEntry> en = zf.getEntries();
  18     int length = 0;
  19     byte[] b = new byte[2048];
  20
  21     // 提取压缩文件夹中的所有压缩实例对象
  22     while (en.hasMoreElements()) {
  23         ZipEntry ze = en.nextElement();
  24         // System.out.println("压缩文件夹中的内容:"+ze.getName());
  25         // System.out.println("是否是文件夹:"+ze.isDirectory());
  26         // 创建解压缩后的文件实例对象
  27         File f = new File(desDir + ze.getName());
  28         // System.out.println("解压后的内容:"+f.getPath());
  29         // System.out.println("是否是文件夹:"+f.isDirectory());
  30         // 如果当前压缩文件中的实例对象是文件夹就在解压缩后的文件夹中创建该文件夹
  31         if (ze.isDirectory()) {
  32             f.mkdirs();
  33         } else {
  34             // 如果当前解压缩文件的父级文件夹没有创建的话,则创建好父级文件夹
  35             if (!f.getParentFile().exists()) {
  36                 f.getParentFile().mkdirs();
  37             }
  38
  39             // 将当前文件的内容写入解压后的文件夹中。
  40             OutputStream outputStream = new FileOutputStream(f);
  41             InputStream inputStream = zf.getInputStream(ze);
  42             while ((length = inputStream.read(b)) > 0)
  43                 outputStream.write(b, 0, length);
  44
  45             inputStream.close();
  46             outputStream.close();
  47         }
  48     }
  49     zf.close();
  50 }
  解压缩的过程并不复杂,读取zip文件,提取里面的每个zip实体,然后将其解压缩。
  如果该zip实体是目录,则在解压到的文件夹中创建文件夹,如果是文件,则在指定的目录中创建文件。
  这个zip压缩与解压缩代码基本完毕,写个代码测试一下效果:
  1         try {
  2             long starTime = 0;
  3             long endTime = 0;
  4
  5             // 测试压缩目录
  6             // ZIPDIR("c:\\A",
  7             // "c:\\A.zip");
  8
  9             // 测试压缩单个文件
  10             // ZIPFile("c:\\A.txt",
  11             // "c:\\A.zip");
  12
  13             System.out.println("开始压缩...");
  14             starTime = System.currentTimeMillis();
  15             ZIP("c:\\A",
  16                     "c:\\A.zip");
  17             endTime = System.currentTimeMillis();
  18             System.out.println("压缩完毕!花费时间: " + (endTime - starTime) + " 毫秒!");
  19
  20             System.out.println("开始解压...");
  21             starTime = System.currentTimeMillis();
  22             UnZIP("c:\\A.zip",
  23                     "c:\\A\\");
  24             endTime = System.currentTimeMillis();
  25             System.out.println("解压完毕!花费时间: " + (endTime - starTime) + " 毫秒!");
  26
  27         } catch (Exception ex) {
  28             // TODO Auto-generated catch block
  29             ex.printStackTrace();
  30         }

自己插入一段代码测试:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;


//解压一个zip文件
public class ZipTest {

	public static void main(String args[]) throws IOException {
		String sourceFileName = "D:/text.zip";
		String desDir = "D:/";
		UnZIP(sourceFileName,desDir);
	}
	public static void UnZIP(String sourceFileName, String desDir) throws IOException {
	     ZipFile zf = new ZipFile(new File(sourceFileName));
	     Enumeration<ZipEntry> en = zf.getEntries();
	     int length = 0;
	     byte[] b = new byte[2048];
	    // 提取压缩文件夹中的所有压缩实例对象
	     while (en.hasMoreElements()) {
	        ZipEntry ze = en.nextElement();
	       // 创建解压缩后的文件实例对象
	        File f = new File(desDir + ze.getName());
	        // 如果当前压缩文件中的实例对象是文件夹就在解压缩后的文件夹中创建该文件夹
	        if (ze.isDirectory()) {
	        	f.mkdirs();
	        } else {
	        	// 如果当前解压缩文件的父级文件夹没有创建的话,则创建好父级文件夹
	        	if (!f.getParentFile().exists()) {
	              f.getParentFile().mkdirs();
	        	}
	        	// 将当前文件的内容写入解压后的文件夹中。
            OutputStream outputStream = new FileOutputStream(f);
	        InputStream inputStream = zf.getInputStream(ze);
	        while ((length = inputStream.read(b)) > 0){
	        	 outputStream.write(b, 0, length);  
	          }
	        inputStream.close();
	        outputStream.close();
	        }
	    }
	    zf.close();
	}
}
 
分享到:
评论

相关推荐

    java zip文件压缩与解压缩

    解压缩ZIP文件则可以使用`org.apache.commons.compress.archivers.zip.ZipArchiveInputStream`类。同样,我们需要设置正确的编码来正确读取中文文件名: ```java import org.apache.commons.compress.archivers.zip...

    JAVA文件压缩与解压缩实践(源代码).zip

    JAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩...

    JAVA文件压缩与解压缩实践(源代码+论文)

    在Java编程语言中,文件的压缩与解压缩是常见的数据处理操作,特别是在数据传输、存储优化和备份场景中。本实践项目围绕这个主题展开,包括源代码和相关的论文,为学习者提供了深入理解和应用Java压缩库的机会。以下...

    JAVA文件压缩与解压缩实践,java解压缩zip文件,Java源码.zip

    在Java编程语言中,文件的压缩与解压缩是常见的操作,尤其在数据传输、存储优化以及备份场景下显得尤为重要。...通过上述知识点,开发者能够有效地在Java环境中进行ZIP文件的压缩与解压缩操作,满足实际项目需求。

    java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文).zip

    java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文).zip java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文).zip java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文)....

    JAVA文件压缩与解压缩实践(源代码+LW).zip

    JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践...

    JAVA文件压缩与解压缩实践(源代码+论文).zip

    JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与...

    java 解压缩zip文件

    在Java编程语言中,解压缩ZIP文件是一项常见的任务,特别是在处理数据传输、文件打包和部署等场景下。本文将深入探讨如何使用Java API来解压缩ZIP文件,包括基本概念、核心类库以及具体实现步骤。 ZIP文件是一种...

    java 操作Zip文件(压缩、解压、加密).zip

    Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...

    java 中 zip压缩文件解压工具类

    虽然Ant不直接用于解压缩文件,但可以与Java代码结合使用,例如通过Ant任务来调用`CompressFileUtils`进行解压缩操作。Ant提供了一系列的任务,如`unzip`,可以直接在构建脚本中用于解压缩文件。 至于标签“文件解...

    (JAVA)利用Java实现zip压缩.解压缩.rar_decompress rar java_zip 压缩

    在Java编程语言中,我们...总的来说,Java中的ZIP压缩和解压缩功能强大且易于使用,是开发人员处理文件压缩需求的首选工具。通过熟练掌握`java.util.zip`包,你可以轻松地在Java应用程序中实现文件的压缩和解压缩功能。

    java android zip解压缩(解决压缩中文乱码问题)

    本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...

    Java 项目-java的JAVA文件压缩与解压缩实践.zip

    总结来说,这个项目旨在帮助开发者掌握Java中文件的压缩与解压缩操作,这对于任何涉及文件管理、数据传输或者打包发布的Java项目都是至关重要的技能。通过实践这些代码,开发者不仅可以学习到基本的文件I/O操作,还...

    Java工具类ZIP解压缩

    Java工具类ZIP解压缩Java工具类ZIP解压缩Java工具类ZIP解压缩

    java ZIP 解压缩

    java语言操作解压缩文件。 /** * 数据压缩 * * @param data * @return * @throws Exception */ public static byte[] compress(byte[] data) throws Exception { ByteArrayInputStream bais = new ...

    java zip解压缩

    本文将详细讲解如何使用Java进行Zip文件的压缩与解压缩操作,并结合给定的标签"源码"和"工具"来探讨实际应用场景。 一、Java Zip压缩 1. 使用`ZipOutputStream`类进行压缩: `ZipOutputStream`是Java提供的用于...

    基于JAVA的文件压缩与解压缩实践(源代码+论文)

    本文件包包含了基于Java的文件压缩与解压缩实践的源代码和一篇详尽的论文。这个实践项目旨在利用Java编程语言实现文件的压缩与解压缩功能,为用户提供一个高效、稳定且易于使用的文件处理工具。 源代码部分包含了...

Global site tag (gtag.js) - Google Analytics