`
feipigzi
  • 浏览: 111530 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java实现Zip的压缩和解压

阅读更多

jdk 1.6 环境下使用 java.util.zip.* 相关的类会存在中文乱码或者读取中文文件出错的问题,所以使用了 ant.jar 库里面的部分类,见代码import部分

package zip;

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

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

public class ZipUtils {
	
	private static final int BUFFER = 1024;  
	private static final String sun_jnu_encoding = System.getProperty("sun.jnu.encoding");
	private static final String file_encoding = System.getProperty("file.encoding");
	
	private static final String encoding = (sun_jnu_encoding == null) ? //
												(file_encoding == null ? "GBK" : file_encoding)//
														: sun_jnu_encoding;//
	
	/**
	 * decompress the zip file (corresponding the zipFilePath) to
	 * the assigned directory represented as destDirPath
	 * the name of the result file is same as the name of zip File
	 * 
	 * @param zipFilePath full path of zip file
	 * @param destDirPath directory which contains the result
	 * @throws IOException
	 */
	public static void unZip(String zipFilePath, String destDirPath)
			throws IOException {
		
		if(zipFilePath == null || destDirPath == null){
			throw new NullPointerException("the path of ZipFile and destination directory both are not Null");
		}
		
		ZipFile zipFile = new ZipFile(zipFilePath);
		File destDir = new File(destDirPath);
		forceMkdir(destDir);
		
		byte[] buf = new byte[BUFFER];
		int len = 0;
		Enumeration<?> entries = zipFile.getEntries();
		while(entries.hasMoreElements()){
			ZipEntry nextEntry = (ZipEntry) entries.nextElement();
			String zipEntryName = nextEntry.getName();
			//if the ZipEntry is directory, make directory
			//else, wirte the file
			File file = new File(destDir, zipEntryName);
			if(nextEntry.isDirectory()){
				forceMkdir(file);
			}
			else{
				InputStream zin = zipFile.getInputStream(nextEntry);
				if(!file.getParentFile().exists()){
					forceMkdir(file.getParentFile());
				}
				FileOutputStream fout = new FileOutputStream(file);
				while( (len = zin.read(buf)) != -1){
					fout.write(buf, 0, len);
				}
				fout.close();
				zin.close();
			}
		}
	}
	
	/**
	 * compress a target (file or directory) to a zip file
	 * that it's name is same as the name of target,
	 * and it is saved in the current path (exists under the 
	 * same directory with the target)
	 * 
//	 * @param srcFilePath the full path of target file or directory
	 * @throws IOException
	 */
	public static void zip(String srcFilePath) throws IOException{
		if(srcFilePath == null){
			throw new NullPointerException();
		}
		File file = new File(srcFilePath);
		
		//the target is folder "aa"  ->   aa.zip
		//the target is file "bb.txt"  ->  bb.zip
		String zipFileName = file.getName().replaceFirst("^(.*?)(?:\\.[\\w]+)?$", "$1.zip");
		
		zip(srcFilePath, new File(file.getParent(), zipFileName).getCanonicalPath());
		
	}
	
	/**
	 * if destZipFilePath is like "c:/a/b", here means the result zip file whose name is
	 * same as the target (file or directory) will be saved under the assigned directory "c:/a/b",
 	 * otherwise when it like "...../a/b/c.zip", the assigned file path is the path of the
 	 * result zip file
	 * @param srcFilePath the full path of target file or directory
	 * @param destZipFilePath 
	 * @throws IOException
	 */
	public static void zip(String srcFilePath, String destZipFilePath) throws IOException{
		if(srcFilePath == null || destZipFilePath == null){
			throw new NullPointerException();
		}
		
		File srcFile = new File(srcFilePath);
		
		if(!srcFile.exists()){
			throw new IllegalArgumentException("srcFilePath can not finded");
		}
		
		ZipOutputStream zout = new ZipOutputStream(new File(destZipFilePath));
		
		zout.setEncoding(encoding);
		
		zipFile( srcFile, zout, "");
		
		zout.close();
	}
	
	private static void zipFile(File srcFile, ZipOutputStream zout, String dir) throws IOException {

		if (srcFile.isDirectory()) {
			File[] files = srcFile.listFiles();
			for (File file:files){
				String zipEntryName = 
						(dir == null || dir.length() == 0) ? srcFile.getName() : (dir + "\\" + srcFile.getName());
				zipFile(file, zout, zipEntryName);
			}
		} else {
			String entryName = null;
			if (!"".equals(dir))
				entryName = dir + "\\" + srcFile.getName();
			else
				entryName = srcFile.getName();
			ZipEntry entry = new ZipEntry(entryName);
			zout.putNextEntry(entry);
			InputStream is = new FileInputStream(srcFile);
			int len = 0;
			while ((len = is.read()) != -1)
				zout.write(len);
			is.close();
		}
	}


	private static void forceMkdir(File directory) throws IOException {
		if (directory.exists()) {
			if (!directory.isDirectory()) {
				String message = "File " + directory + " exists and is "
						+ "not a directory. Unable to create directory.";
				throw new IOException(message);
			}
		} else {
			if (!directory.mkdirs()) {
				// Double-check that some other thread or process hasn't made
				// the directory in the background
				if (!directory.isDirectory()) {
					String message = "Unable to create the not-existed directory " + directory;
					throw new IOException(message);
				}
			}
		}
	}

}
 
分享到:
评论

相关推荐

    java 文件zip 压缩与解压

    java 文件zip 压缩与解压 可以直接调用

    java解压zip压缩文件

    在Java编程环境中,解压ZIP压缩文件是一项常见的任务,它涉及到文件I/O操作以及对ZIP文件格式的理解。本文将深入探讨如何使用Java实现这一功能,同时也会提及`UnZip.java`和`UnZip2.java`这两个文件可能包含的实现...

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

    本文将深入探讨如何使用Java来处理ZIP文件,特别是针对标题所提及的“java 中 zip压缩文件解压工具类”。我们将讨论核心的Java API,如`java.util.zip`包中的类,并通过一个名为`CompressFileUtils`的工具类来展示...

    使用 Java 实现的压缩/解压 ZIP 文件的工具类

    本文将深入探讨如何使用Java实现ZIP文件的压缩与解压,重点讲解核心API,如`java.util.zip`包中的`ZipOutputStream`和`ZipInputStream`。 首先,我们来了解一下ZIP文件格式。ZIP是一种用于存储多个文件到一个单一...

    Java实现的带密码压缩与解压zip文件源码

    在Java编程环境中,处理压缩和解压缩文件是一...以上是关于Java实现带密码的ZIP文件压缩和解压的基本概念和实现细节。通过深入理解这些知识点,开发者可以构建自己的安全文件处理工具,满足对数据隐私和安全性的需求。

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

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

    java实现的解压与压缩 zip和rar类型的

    本文将深入探讨如何使用Java实现ZIP和RAR类型的压缩与解压操作,以及相关知识点。 首先,我们来看ZIP文件格式。ZIP是一种广泛使用的文件压缩格式,其在Java中的处理主要通过`java.util.zip`包。这个包提供了多个类...

    java版zip压缩解压代码

    `java版zip压缩解压代码`提供了在命令行环境中实现这一功能的程序。这个程序主要利用了Java的内置库,尤其是`java.util.zip`包中的类,如`ZipOutputStream`和`ZipInputStream`,来实现对文件和文件夹的ZIP压缩与解压...

    Java实现将多目录多层级文件打成ZIP包,以及解压ZIP包

    `FileUtils.java`类是这个功能的具体实现,它封装了上述的压缩和解压过程,使开发者能够轻松地在代码中调用这些功能。理解并掌握这些知识,对于进行Java相关的文件操作和数据打包工作至关重要。

    java Zip压缩解压

    总结来说,"java Zip压缩解压"涉及了Java标准库中的`java.util.zip`包,用于创建和读取ZIP文件;Apache Ant作为构建工具,可能用于自动化压缩和解压过程;而JUnit则用于编写和运行测试,确保代码的正确实现。在实际...

    Java zip 压缩/解压源码

    这个`Java zip 压缩/解压源码`的资源提供了一个简洁易用的API,使得开发者能够方便地对文件进行压缩和解压缩操作。下面我们将深入探讨Java中处理`zip`文件的相关知识。 1. **Java ZipFile类**: `java.util.zip....

    利用Java实现zip压缩解压缩

    ### Java 实现 ZIP 文件压缩与解压缩 #### 知识点概述 在现代软件开发过程中,数据压缩是一项非常重要的技术,特别是在处理大量数据时。Java 作为一种广泛应用的编程语言,提供了丰富的 API 来支持文件的压缩与解...

    java将文件夹压缩成zip,解压zip压缩包

    本篇文章将详细探讨如何使用Java内置的IO流来实现文件夹的zip压缩以及zip压缩包的解压,无需依赖其他的第三方库如Apache Commons IO或JavaZip。 ### 文件夹压缩成ZIP 首先,我们需要理解如何将一个文件夹及其内容...

    java压缩解压ZIP

    java压缩解压ZIP

    JAVA实现目录及文件的zip压缩和解压

    在Java编程环境中,对目录和文件进行ZIP压缩与解压是一项常见的操作,特别是在处理大量数据或者需要进行文件传输时。本文将深入探讨如何使用Java来实现这一功能。 首先,我们需要了解ZIP文件格式,它是一种广泛使用...

    详解Java无需解压直接读取Zip文件和文件内容

    Java无需解压直接读取Zip文件和文件内容是Java语言中的一种常见操作,通过使用java.util.zip包中的ZipFile、ZipInputStream和ZipEntry类,我们可以轻松地读取Zip文件和文件内容。下面,我们将详细介绍如何使用Java...

    java zip 压缩解压例子

    Java的Zip压缩和解压是Java IO和Java Archive(JAR)库中的一部分,用于处理.zip格式的文件。在Java中,我们可以使用`java.util.zip`包中的类,如`ZipOutputStream`和`ZipInputStream`来实现文件或目录的压缩与解压...

    Java压缩解压ZIP之Zip4j

    这篇博客文章“Java压缩解压ZIP之Zip4j”可能详细介绍了如何使用Zip4j进行文件的压缩和解压缩操作。 首先,我们需要了解Zip4j库的核心概念。Zip4j提供了一个名为`ZipFile`的类,它代表一个ZIP文件,包含了所有与ZIP...

    用java.util.zip包现数据压缩与解压

    ### 使用 Java.util.zip 包实现数据压缩与解压 在计算机科学领域,数据压缩技术是一项重要的功能,它能够帮助减少存储空间的需求以及提高网络传输效率。本文将通过一系列的示例来详细介绍如何利用 Java 中的 `java....

Global site tag (gtag.js) - Google Analytics