`

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

阅读更多
1.import java.io.BufferedInputStream;   
2.import java.io.BufferedOutputStream;   
3.import java.io.File;   
4.import java.io.FileInputStream;   
5.import java.io.FileOutputStream;   
6.import java.io.IOException;   
7.import java.io.InputStream;   
8.import java.io.OutputStream;   
9.import java.util.ArrayList;   
10.import java.util.Enumeration;   
11.import java.util.List;   
12.import java.util.zip.ZipEntry;   
13.import java.util.zip.ZipFile;   
14.import java.util.zip.ZipOutputStream;   
15.  
16.public class ZipToFile {   
17.       
18.    public static final String ZIP_FILENAME = "C:\\XJPDA.zip";//需要解压缩的文件名   
19.    public static final String ZIP_DIR = "C:\\XJPDA\\";//需要压缩的文件夹   
20.    public static final String UN_ZIP_DIR = "C:\\";//要解压的文件目录   
21.    public static final int BUFFER = 1024 ;//缓存大小   
22.       
23.    /**  
24.    * zip压缩功能.  
25.    * 压缩baseDir(文件夹目录)下所有文件,包括子目录  
26.    * @throws Exception  
27.    */  
28.    public static void zipFile(String baseDir,String fileName) throws Exception{   
29.        List fileList=getSubFiles(new File(baseDir));   
30.        ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));   
31.        ZipEntry ze=null;   
32.        byte[] buf=new byte[BUFFER];   
33.        int readLen=0;   
34.        for(int i = 0; i <fileList.size(); i++) {   
35.            File f=(File)fileList.get(i);   
36.            ze=new ZipEntry(getAbsFileName(baseDir, f));   
37.            ze.setSize(f.length());   
38.            ze.setTime(f.lastModified());      
39.            zos.putNextEntry(ze);   
40.            InputStream is=new BufferedInputStream(new FileInputStream(f));   
41.            while ((readLen=is.read(buf, 0, BUFFER))!=-1) {   
42.                zos.write(buf, 0, readLen);   
43.            }   
44.            is.close();   
45.        }   
46.        zos.close();   
47.    }   
48.       
49.    /**  
50.    * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.  
51.    * @param baseDir java.lang.String 根目录  
52.    * @param realFileName java.io.File 实际的文件名  
53.    * @return 相对文件名  
54.    */  
55.    private static String getAbsFileName(String baseDir, File realFileName){   
56.        File real=realFileName;   
57.        File base=new File(baseDir);   
58.        String ret=real.getName();   
59.        while (true) {   
60.            real=real.getParentFile();   
61.            if(real==null)    
62.                break;   
63.            if(real.equals(base))    
64.                break;   
65.            else  
66.                ret=real.getName()+"/"+ret;   
67.        }   
68.        return ret;   
69.    }   
70.       
71.    /**  
72.    * 取得指定目录下的所有文件列表,包括子目录.  
73.    * @param baseDir File 指定的目录  
74.    * @return 包含java.io.File的List  
75.    */  
76.    private static List getSubFiles(File baseDir){   
77.        List ret=new ArrayList();   
78.        File[] tmp=baseDir.listFiles();   
79.        for (int i = 0; i <tmp.length; i++) {   
80.            if(tmp[i].isFile())   
81.                ret.add(tmp[i]);   
82.            if(tmp[i].isDirectory())   
83.                ret.addAll(getSubFiles(tmp[i]));   
84.        }   
85.        return ret;   
86.    }   
87.       
88.    /**  
89.    * 解压缩功能.  
90.    * 将ZIP_FILENAME文件解压到ZIP_DIR目录下.  
91.    * @throws Exception  
92.    */  
93.    public static void upZipFile() throws Exception{   
94.        ZipFile zfile=new ZipFile(ZIP_FILENAME);   
95.        Enumeration zList=zfile.entries();   
96.        ZipEntry ze=null;   
97.        byte[] buf=new byte[1024];   
98.        while(zList.hasMoreElements()){   
99.            ze=(ZipEntry)zList.nextElement();          
100.            if(ze.isDirectory()){   
101.                File f=new File(ZIP_DIR+ze.getName());   
102.                f.mkdir();   
103.                continue;   
104.            }   
105.            OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));   
106.            InputStream is=new BufferedInputStream(zfile.getInputStream(ze));   
107.            int readLen=0;   
108.            while ((readLen=is.read(buf, 0, 1024))!=-1) {   
109.                os.write(buf, 0, readLen);   
110.            }   
111.            is.close();   
112.            os.close();    
113.        }   
114.        zfile.close();   
115.    }   
116.  
117.    /**  
118.    * 给定根目录,返回一个相对路径所对应的实际文件名.  
119.    * @param baseDir 指定根目录  
120.    * @param absFileName 相对路径名,来自于ZipEntry中的name  
121.    * @return java.io.File 实际的文件  
122.    */  
123.    public static File getRealFileName(String baseDir, String absFileName){   
124.        String[] dirs=absFileName.split("/");   
125.        File ret=new File(baseDir);   
126.        if(dirs.length>1){   
127.            for (int i = 0; i < dirs.length-1;i++) {   
128.                ret=new File(ret, dirs[i]);   
129.            }   
130.            if(!ret.exists())   
131.                ret.mkdirs();   
132.            ret=new File(ret, dirs[dirs.length-1]);   
133.            return ret;   
134.        }   
135.        return ret;   
136.    }   
137.  
138.}  
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里修正了这一现象。
原文地址:http://orz.iteye.com/blog/110842
分享到:
评论

相关推荐

    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向服务器上传文件压缩包并实现解压缩

    在这个场景中,我们关注的是如何使用Java来实现文件压缩包的上传以及在服务器上的解压缩。Java作为一种强大的编程语言,提供了丰富的库来支持这样的操作,特别是在涉及到SFTP(Secure File Transfer Protocol)时,...

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

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

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

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

Global site tag (gtag.js) - Google Analytics