`
wdmcygah
  • 浏览: 62305 次
社区版块
存档分类
最新评论

基于JDK API实现文件的压缩与解压

    博客分类:
  • J2SE
阅读更多

在实际开发过程中,会经常遇到下载附件或者导出报表的情况,有时候文件会比较多,用户更希望多个文件可以一起打包进行下载。这时就需要实现两部分功能:一部分是多个文件的打包处理,一部分是压缩文件的下载功能。

对于压缩文件的下载,可查看我的另一篇博文(SpringMVC下打包文件的下载),本文主要提供多个文件的压缩与解压的例子。样例完全基于JDK自带的IO流处理类,主要相关类为ZipInputStream和ZipOutputStream,使用JDK API已经能够满足压缩与解压的需求。我看网上有不少提到压缩中文乱码的问题,建议用ant.jar中包的ZIP处理类进行处理,我进行了相关测试:使用JDK1.6进行压缩会出现压缩包中的文件中文名乱码,但是使用JDK1.7或者JDK1.8不会乱码。

所以本样例正常运行需要使用JDK1.7+的版本。

另注:本样例仍然有个问题有待解决:我分别使用txt文件、excel文件、word文件进行压缩测试,压缩正常,使用WinRAR工具解压后文件也能正常查看。但是使用JDK的IO流解压后,只有txt文件查看正常,excel与word文件都损坏了,无法正常查看。这个问题仍未找到原因与解决方案,若有大神告知,感激不尽。

下面直接上代码:
一、压缩与解压工具类

ZipUtils.java 

package research.j2se.io;

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;
import java.util.zip.ZipOutputStream;

/**
 * 使用JDK自带的Zip处理类进行文件的压缩与解压
 *
 */
public class ZipUtils {
	
	/**
	 * 压缩文件(一个或多个)到指定压缩包
	 */
	public static void zip( String targetFilePath, String ... sourceFilePaths){
		if( sourceFilePaths == null || sourceFilePaths.length == 0 ){
			return;
		}
		try {
			File targetFile = new File(targetFilePath);
			ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(targetFile));
			BufferedInputStream bis = null;
			byte [] buffer = new byte[512];
			for( int i = 0; i < sourceFilePaths.length; i++ ){
				File sourceFile = new File(sourceFilePaths[i]);
				if( sourceFile.exists() ){
					//目标文件不存在则创建文件
					if( ! targetFile.exists() ){
						targetFile.createNewFile();
					}
					String sourceFileName = sourceFile.getName();
					ZipEntry entry = new ZipEntry(sourceFileName);
					//设置压缩包的入口
					zos.putNextEntry(entry);
					bis = new BufferedInputStream(new FileInputStream(sourceFile));
					while( bis.read(buffer) != -1){
						zos.write(buffer);
					}
				}
			}
			bis.close();
			zos.flush();
			zos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 解压文件到指定目录
	 */
	public static void unzip(String targetDirPath, String ... sourceFilePaths){
		if( sourceFilePaths == null || sourceFilePaths.length == 0 ){
			return;
		}
		//解压目录不存在则创建
		File targetDir = new File(targetDirPath);
		if( ! targetDir.exists() ){
			targetDir.mkdirs();
		}
		try {
			byte [] buffer = new byte[512];
			for( int i = 0; i < sourceFilePaths.length; i++ ){
				File sourceFile = new File(sourceFilePaths[i]);
				ZipInputStream zis = new ZipInputStream(new FileInputStream(sourceFile));
				ZipEntry entry = null;
				//遍历压缩文件的各个入口
				while( (entry=zis.getNextEntry()) != null ){
					String fileName = entry.getName();
					//创建对应的文件
					File file = new File(targetDirPath+File.separator + fileName);
					if( ! file.exists() ){
						file.createNewFile();
					}
					//进行文件的写入
					BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file,true));
					while( zis.read(buffer) != -1 ){
						bos.write(buffer);
					}
					zis.closeEntry();
					bos.flush();
					bos.close();
				}
				zis.close();
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch( Exception e ){
			e.printStackTrace();
		}
	}
	
}

 二、压缩与解压测试类

JdkZipUtilsTest.java

package research.j2se.io;

import junit.framework.TestCase;
import research.j2se.io.ZipUtils;

/**
 * jdk压缩解压工具类测试
 */
public class JdkZipUtilsTest
    extends TestCase
{
   
	/**
	 * 测试压缩文件
	 */
    public void testZip()
    {
    	String targetFilePath = "src/main/resources/ziptarget/zip/压缩.zip";
    	String sourceFilePath1 = "src/main/resources/zipsource/unzip/测试1.xlsx";
    	String sourceFilePath2 = "src/main/resources/zipsource/unzip/测试2.txt";
    	String sourceFilePath3 = "src/main/resources/zipsource/unzip/测试3.docx";
        ZipUtils.zip(targetFilePath, sourceFilePath1,sourceFilePath2,sourceFilePath3);
    }
    
    /**
     * 测试解压文件(这里Excel文件解压无法打开,使用解压工具可以打开)
     */
    public void testUnzip(){
    	String targetDirPath = "src/main/resources/ziptarget/unzip";
    	String sourceFilePath1 = "src/main/resources/zipsource/zip/压缩.zip";
    	ZipUtils.unzip(targetDirPath, sourceFilePath1);
    }
}

 

本样例测试通过。若要查看完整源码,可访问:https://github.com/wdmcygah/research-J2SE.git

分享到:
评论

相关推荐

    jdk1.6 解压版-windows

    `jar`命令支持压缩和解压,以及创建可执行的jar文件。 5. **Java性能分析工具**(jconsole、jvisualvm等):这些工具帮助开发者监控和管理Java应用程序的性能,包括内存使用、线程状态、CPU消耗等。 6. **Java调试...

    jdk1.8压缩版解压即用

    本压缩包提供的JDK 1.8是解压即用的版本,这意味着用户无需进行复杂的安装过程,只需将其解压缩到任意目录,然后设置系统环境变量`JAVA_HOME`指向该目录,同时将`PATH`环境变量添加其`bin`子目录即可。这种方式减少...

    Java 中调用 Apache API 实现图片文件的 压缩 与 解压 的 Demo 下载

    Java 中调用 Apache API 实现图片文件的 压缩 与 解压 的 Demo 考虑到在实际的项目开发的过程中,可能会涉及到文件的路径为中文路径,这时如果使用 Java 原生的 JDK 则无法处理乱码问题,使用 Apache API 就可以在...

    JDK8/jdk1.8压缩版文件下载(压缩包)(无积分免费下载)

    **JDK8/jdk1.8 压缩版文件详解** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包,其中JDK8是Java编程语言的一个重要版本,对应于Java SE(Standard Edition)8。在本压缩包...

    JDK1.8版本免安装解压缩版

    **JDK 1.8免安装解压缩版详解** JDK(Java Development Kit)是Java编程语言的软件开发工具包,它为Java开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK 1.8是Oracle公司发布的一个重要版本,其中...

    jdk1.8.zip解压版本

    用户只需要将zip文件解压缩到合适的位置,然后设置`JAVA_HOME`环境变量指向JDK的安装目录,并将`PATH`环境变量更新以包含JDK的bin目录,即可开始使用Java开发工具。 总结来说,JDK 1.8在编程语言和API方面带来了...

    JDK1.8 windows zip解压缩版

    JDK1.8 Windows Zip解压缩版是一款专为Windows操作系统设计的Java Development Kit(Java开发工具包)的非安装版本,它以ZIP压缩格式提供,方便用户下载后直接解压使用,无需经过传统的安装过程。这个版本特别适合...

    jdk-mac-11解压版jdk11;

    在Mac平台上,JDK通常以.dmg格式提供,但这个标题表明这是一个已经解压缩的版本,可能是因为用户找不到直接可用的解压版,或者是为了方便那些不习惯安装.dmg文件的用户。 描述中的“居然全网没有解压版”意味着在...

    JDK11 windows zip 解压缩版

    1. **下载与解压**:首先从官方渠道下载JDK11的Windows Zip版本,然后使用Windows自带的资源管理器或第三方解压缩软件将其解压到合适的目录。 2. **配置环境变量**: - `JAVA_HOME`:设置为JDK的根目录,例如`C:\...

    jdk1.8 201Windows解压版

    7. **Nashorn JavaScript引擎**:Java 8引入了Nashorn JavaScript引擎,允许在Java应用中直接执行JavaScript代码,实现Java与JavaScript的交互。 8. **类型推断增强**:编译器现在可以更好地推断泛型实例化时的类型...

    JDK1.8压缩包下载解压即用

    提供两种资源方式:(JDK1.8压缩包64位Windows版本)上面JDK1.8压缩包直接下载(解压一下就可以用),想自己下载的下方官网网址自行查找 官网下载地址:https://www.oracle.com/java/technologies/downloads/ JDK...

    jdk11压缩包,解压后配置环境就可以用

    - **jdk.crypto.mscapi**: 提供了与Microsoft Cryptographic API (MSCAPI)的接口,用于加密操作。 - **jdk.jstatd**: 是一个JVM统计监测服务器,允许远程客户端连接并收集性能数据。 - **jdk.jdwp.agent**: 用于...

    JDK8 window64 压缩免安装版

    - **解压与设置路径**:下载JDK8的Windows 64位压缩文件后,解压到任意目录,如`C:\Program Files\Java`,然后将该路径添加到系统的PATH环境变量中。 - **验证安装**:打开命令行,输入`java -version`,如果正确...

    jdk1.8压缩版

    标题中的"jdk1.8压缩版"指的是这个软件包是JDK 1.8的压缩格式,通常以.zip或.tar.gz等常见压缩文件格式存储,方便用户下载和传输。这样的压缩包在下载后需要进行解压缩才能使用。 描述中提到"解压后去配置系统环境...

    windows的jdk安装包,可直接解压安装

    1. **下载与解压**:下载适用于Windows的JDK安装包,这里是一个压缩文件。找到并下载这个名为“jdk安装包”的文件,然后使用WinRAR或类似工具将其解压到一个方便的位置,比如"C:\Program Files"目录下。 2. **设置...

    JDK 8 压缩包文件 免费分享

    3. `lib` 目录:存放了JDK的各种库文件,包括rt.jar(Java运行时类库)、charsets.jar(字符集支持)、jfxswt.jar(JavaFX与SWT的桥接库)等。 4. `docs` 目录:通常包含API文档,帮助开发者了解每个类和方法的功能...

    JDK11(包含解压版和安装包)

    另一方面,`jdk-11.0.7_windows-x64_bin.zip`是压缩文件,需要先解压缩到指定目录,然后配置环境变量`JAVA_HOME`指向解压后的根目录,以及将`bin`子目录添加到`PATH`变量中,以便在命令行中能够使用JDK工具。...

    jdk1.7 64位 解压缩版

    在这个特定的案例中,我们讨论的是"jdk1.7 64位 解压缩版",这意味着它是针对64位操作系统设计的JDK1.7版本,无需安装,只需解压即可使用。 JDK1.7,也被称为Java 7或Java SE 7(Java Standard Edition 7),是...

    jdk1.8.rar 无需安装,下载后解压配置即可。

    1. **解压文件**:首先,需要将"jdk1.8.rar"解压缩到你选择的目录。确保选择一个易于访问的位置,因为路径可能需要在后续配置中引用。 2. **设置环境变量**: - `JAVA_HOME`:指向JDK的安装目录。 - `PATH`:在...

    jdk11绿色解压版win10win7

    1. **下载与解压**: 从可靠的源获取JDK11的绿色解压版,如“jdk11.0.2”文件。将压缩包下载到本地,然后选择合适的位置进行解压缩,例如“C:\Program Files\Java”。 2. **配置环境变量**: 这一步对于让系统识别JDK...

Global site tag (gtag.js) - Google Analytics