`
and4walker
  • 浏览: 564873 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA实现压缩/解压缩zip文件

    博客分类:
  • JAVA
阅读更多
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipToFile {
	
	public static final String ZIP_FILENAME	= "C:\\XJPDA.zip";//需要解压缩的文件名
	public static final String ZIP_DIR = "C:\\XJPDA\\";//需要压缩的文件夹
	public static final String UN_ZIP_DIR = "C:\\";//要解压的文件目录
	public static final int BUFFER = 1024 ;//缓存大小
	
	/**
	* zip压缩功能.
	* 压缩baseDir(文件夹目录)下所有文件,包括子目录
	* @throws Exception
	*/
	public static void zipFile(String baseDir,String fileName) throws Exception{
		List fileList=getSubFiles(new File(baseDir));
		ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));
		ZipEntry ze=null;
		byte[] buf=new byte[BUFFER];
		int readLen=0;
		for(int i = 0; i <fileList.size(); i++) {
			File f=(File)fileList.get(i);
			ze=new ZipEntry(getAbsFileName(baseDir, f));
			ze.setSize(f.length());
			ze.setTime(f.lastModified());	
			zos.putNextEntry(ze);
			InputStream is=new BufferedInputStream(new FileInputStream(f));
			while ((readLen=is.read(buf, 0, BUFFER))!=-1) {
				zos.write(buf, 0, readLen);
			}
			is.close();
		}
		zos.close();
	}
	
	/**
	* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
	* @param baseDir java.lang.String 根目录
	* @param realFileName java.io.File 实际的文件名
	* @return 相对文件名
	*/
	private static String getAbsFileName(String baseDir, File realFileName){
		File real=realFileName;
		File base=new File(baseDir);
		String ret=real.getName();
		while (true) {
			real=real.getParentFile();
			if(real==null) 
				break;
			if(real.equals(base)) 
				break;
			else
				ret=real.getName()+"/"+ret;
		}
		return ret;
	}
	
	/**
	* 取得指定目录下的所有文件列表,包括子目录.
	* @param baseDir File 指定的目录
	* @return 包含java.io.File的List
	*/
	private static List getSubFiles(File baseDir){
		List ret=new ArrayList();
		File[] tmp=baseDir.listFiles();
		for (int i = 0; i <tmp.length; i++) {
			if(tmp[i].isFile())
				ret.add(tmp[i]);
			if(tmp[i].isDirectory())
				ret.addAll(getSubFiles(tmp[i]));
		}
		return ret;
	}
	
	/**
	* 解压缩功能.
	* 将ZIP_FILENAME文件解压到ZIP_DIR目录下.
	* @throws Exception
	*/
	public static void upZipFile() throws Exception{
		ZipFile zfile=new ZipFile(ZIP_FILENAME);
		Enumeration zList=zfile.entries();
		ZipEntry ze=null;
		byte[] buf=new byte[1024];
		while(zList.hasMoreElements()){
			ze=(ZipEntry)zList.nextElement();		
			if(ze.isDirectory()){
	            File f=new File(ZIP_DIR+ze.getName());
	            f.mkdir();
				continue;
			}
			OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));
			InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
			int readLen=0;
			while ((readLen=is.read(buf, 0, 1024))!=-1) {
				os.write(buf, 0, readLen);
			}
			is.close();
			os.close();	
		}
		zfile.close();
	}

	/**
	* 给定根目录,返回一个相对路径所对应的实际文件名.
	* @param baseDir 指定根目录
	* @param absFileName 相对路径名,来自于ZipEntry中的name
	* @return java.io.File 实际的文件
	*/
	public static File getRealFileName(String baseDir, String absFileName){
		String[] dirs=absFileName.split("/");
		File ret=new File(baseDir);
		if(dirs.length>1){
			for (int i = 0; i < dirs.length-1;i++) {
				ret=new File(ret, dirs[i]);
			}
			if(!ret.exists())
				ret.mkdirs();
			ret=new File(ret, dirs[dirs.length-1]);
			return ret;
		}
		return ret;
	}

}


不过上面存在中文问题
是因为java.util.zip下的格式转换有问题

import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
改成
import org.apache.tools.zip.*;
即可!
apache里修正了这一现象。
分享到:
评论
6 楼 hanmiao 2013-11-18  
另外,你的解压方法的方法名的定义改下吧,叫unzipFile(String zipFileName, String zipDir)是不是更加通用些?
5 楼 hanmiao 2013-11-18  
快乐向日葵 写道
cherryzhu 写道
你好,我使用这个方法的时候发现了一个错误
在getRealFileName这个方法中,应该把ret=new File(ret, dirs[dirs.length-1]);也放到外到那个return ret;之前。
你说的这个问题确实存在的!
你光承认问题存在,就动动手把那個错误的地方修正下撒,我帮你修改之后的 getRealFileName() 方法如下:
public static File getRealFileName(String baseDir, String absFileName){
		String[] dirs=absFileName.split("/");
		File ret=new File(baseDir);
		if(dirs.length>1){
			for (int i = 0; i < dirs.length-1;i++) {
				ret=new File(ret, dirs[i]);
			}
			if(!ret.exists()){
				ret.mkdirs();
			}
		}
		return new File(ret, dirs[dirs.length-1]);
	}

4 楼 快乐向日葵 2012-05-03  
cherryzhu 写道
你好,我使用这个方法的时候发现了一个错误
在getRealFileName这个方法中,应该把ret=new File(ret, dirs[dirs.length-1]);也放到外到那个return ret;之前。


你说的这个问题确实存在的!
3 楼 悬空90 2011-12-13  
好东西   呵呵
2 楼 cherryzhu 2011-10-19  
你好,我使用这个方法的时候发现了一个错误
在getRealFileName这个方法中,应该把ret=new File(ret, dirs[dirs.length-1]);也放到外到那个return ret;之前。
1 楼 lihy328 2008-05-19  

相关推荐

    Java压缩/解压缩zip

    使用Java核心API实现单文件/多文件/整个目录的压缩/解压缩功能,由于自带API(1.6)不支持指定编码方式,因此中文会出现乱码(1.7貌似已经支持指定编码方式),所以还写了一个基于ant包的压缩/解压缩代码。

    java ZIP压缩/解压缩(同时加解密)解决方案(一)

    本文详细介绍了如何使用 Java 进行 ZIP 文件的压缩与解压缩,以及如何实现文件的加密与解密功能。通过这些方法,可以有效地管理和处理大量的文件数据,提高应用程序的性能和安全性。在实际应用中,还需要注意选择...

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

    4. **源代码实现**:实践中提供的源代码展示了如何使用Java API来实现文件和目录的压缩与解压缩。这可能包括读取文件,创建压缩流,写入数据到压缩流,以及从压缩流中读取和写入文件等步骤。 5. **文件操作**:在...

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

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

    Java zip 压缩/解压源码

    在Java编程语言中,`zip`...通过`ZipFile`、`ZipOutputStream`和`ZipEntry`,我们可以方便地完成文件和目录的压缩与解压缩任务。在实际应用中,理解这些类的用法和交互对于编写高效、可靠的压缩/解压缩程序至关重要。

    java 压缩/解压 .zip/.rar/.tar 文件

    在提供的代码片段中,`unzipFile`方法展示了如何解压缩一个`.zip`文件。它首先创建一个`ZipFile`对象,然后遍历其中的所有`ZipEntry`,如果是目录,则创建对应的目录结构;如果是文件,则通过`getInputStream`获取流...

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

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

    java 解压缩zip文件

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

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

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

    java 实现压缩与解压缩ZIP .doc

    接下来是解压缩ZIP文件的部分。这里同样使用了`java.util.zip`包,但这次使用了`ZipFile`类。以下是解压的关键步骤: 1. 创建一个`ZipFile`对象,传入ZIP文件的路径,如`"E:\\test\\myfiles.zip"`。 2. 使用`...

    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 来支持文件的压缩与解...

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

    我们将讨论核心的Java API,如`java.util.zip`包中的类,并通过一个名为`CompressFileUtils`的工具类来展示如何实现文件的解压缩功能。 首先,`java.util.zip`包提供了几个关键类,用于处理各种压缩格式,如`...

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

    接下来,我们讨论如何解压缩ZIP文件。解压缩通常包括以下步骤: 1. **创建`ZipInputStream`**:同样,你需要创建一个`ZipInputStream`,它从ZIP文件的输入流读取。 ```java FileInputStream fis = new ...

    Java实现压缩与解压缩功能源码

    解压缩ZIP文件的过程则相反,需要创建一个`ZipInputStream`实例,并将其链接到`FileInputStream`。通过调用`getNextEntry()`方法遍历ZIP文件中的每个条目,然后将数据读取到一个缓冲区,并写入目标文件。以下是一个...

    利用Java实现zip压缩/解压缩

    Java 1.1实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解 压缩的实现比较容易,下面介绍利用ZipEntry、ZipInputStream和ZipOutputStream三个Java 类实现zip数据压缩方式的编程方法。 zip压缩...

    java实现压缩和压缩zip格式文件的功能

    解压缩ZIP文件的过程则相反,需要使用`ZipInputStream`从ZIP文件中读取`ZipEntry`并写入目标目录。以下是一个基本的解压缩方法: 1. 打开ZIP文件的`FileInputStream`。 2. 创建`ZipInputStream`,从输入流中读取ZIP...

Global site tag (gtag.js) - Google Analytics