在实际开发过程中,会经常遇到下载附件或者导出报表的情况,有时候文件会比较多,用户更希望多个文件可以一起打包进行下载。这时就需要实现两部分功能:一部分是多个文件的打包处理,一部分是压缩文件的下载功能。
对于压缩文件的下载,可查看我的另一篇博文(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
相关推荐
`jar`命令支持压缩和解压,以及创建可执行的jar文件。 5. **Java性能分析工具**(jconsole、jvisualvm等):这些工具帮助开发者监控和管理Java应用程序的性能,包括内存使用、线程状态、CPU消耗等。 6. **Java调试...
本压缩包提供的JDK 1.8是解压即用的版本,这意味着用户无需进行复杂的安装过程,只需将其解压缩到任意目录,然后设置系统环境变量`JAVA_HOME`指向该目录,同时将`PATH`环境变量添加其`bin`子目录即可。这种方式减少...
Java 中调用 Apache API 实现图片文件的 压缩 与 解压 的 Demo 考虑到在实际的项目开发的过程中,可能会涉及到文件的路径为中文路径,这时如果使用 Java 原生的 JDK 则无法处理乱码问题,使用 Apache API 就可以在...
**JDK8/jdk1.8 压缩版文件详解** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包,其中JDK8是Java编程语言的一个重要版本,对应于Java SE(Standard Edition)8。在本压缩包...
**JDK 1.8免安装解压缩版详解** JDK(Java Development Kit)是Java编程语言的软件开发工具包,它为Java开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK 1.8是Oracle公司发布的一个重要版本,其中...
用户只需要将zip文件解压缩到合适的位置,然后设置`JAVA_HOME`环境变量指向JDK的安装目录,并将`PATH`环境变量更新以包含JDK的bin目录,即可开始使用Java开发工具。 总结来说,JDK 1.8在编程语言和API方面带来了...
JDK1.8 Windows Zip解压缩版是一款专为Windows操作系统设计的Java Development Kit(Java开发工具包)的非安装版本,它以ZIP压缩格式提供,方便用户下载后直接解压使用,无需经过传统的安装过程。这个版本特别适合...
在Mac平台上,JDK通常以.dmg格式提供,但这个标题表明这是一个已经解压缩的版本,可能是因为用户找不到直接可用的解压版,或者是为了方便那些不习惯安装.dmg文件的用户。 描述中的“居然全网没有解压版”意味着在...
1. **下载与解压**:首先从官方渠道下载JDK11的Windows Zip版本,然后使用Windows自带的资源管理器或第三方解压缩软件将其解压到合适的目录。 2. **配置环境变量**: - `JAVA_HOME`:设置为JDK的根目录,例如`C:\...
7. **Nashorn JavaScript引擎**:Java 8引入了Nashorn JavaScript引擎,允许在Java应用中直接执行JavaScript代码,实现Java与JavaScript的交互。 8. **类型推断增强**:编译器现在可以更好地推断泛型实例化时的类型...
提供两种资源方式:(JDK1.8压缩包64位Windows版本)上面JDK1.8压缩包直接下载(解压一下就可以用),想自己下载的下方官网网址自行查找 官网下载地址:https://www.oracle.com/java/technologies/downloads/ JDK...
- **jdk.crypto.mscapi**: 提供了与Microsoft Cryptographic API (MSCAPI)的接口,用于加密操作。 - **jdk.jstatd**: 是一个JVM统计监测服务器,允许远程客户端连接并收集性能数据。 - **jdk.jdwp.agent**: 用于...
- **解压与设置路径**:下载JDK8的Windows 64位压缩文件后,解压到任意目录,如`C:\Program Files\Java`,然后将该路径添加到系统的PATH环境变量中。 - **验证安装**:打开命令行,输入`java -version`,如果正确...
标题中的"jdk1.8压缩版"指的是这个软件包是JDK 1.8的压缩格式,通常以.zip或.tar.gz等常见压缩文件格式存储,方便用户下载和传输。这样的压缩包在下载后需要进行解压缩才能使用。 描述中提到"解压后去配置系统环境...
1. **下载与解压**:下载适用于Windows的JDK安装包,这里是一个压缩文件。找到并下载这个名为“jdk安装包”的文件,然后使用WinRAR或类似工具将其解压到一个方便的位置,比如"C:\Program Files"目录下。 2. **设置...
3. `lib` 目录:存放了JDK的各种库文件,包括rt.jar(Java运行时类库)、charsets.jar(字符集支持)、jfxswt.jar(JavaFX与SWT的桥接库)等。 4. `docs` 目录:通常包含API文档,帮助开发者了解每个类和方法的功能...
另一方面,`jdk-11.0.7_windows-x64_bin.zip`是压缩文件,需要先解压缩到指定目录,然后配置环境变量`JAVA_HOME`指向解压后的根目录,以及将`bin`子目录添加到`PATH`变量中,以便在命令行中能够使用JDK工具。...
在这个特定的案例中,我们讨论的是"jdk1.7 64位 解压缩版",这意味着它是针对64位操作系统设计的JDK1.7版本,无需安装,只需解压即可使用。 JDK1.7,也被称为Java 7或Java SE 7(Java Standard Edition 7),是...
1. **解压文件**:首先,需要将"jdk1.8.rar"解压缩到你选择的目录。确保选择一个易于访问的位置,因为路径可能需要在后续配置中引用。 2. **设置环境变量**: - `JAVA_HOME`:指向JDK的安装目录。 - `PATH`:在...
1. **下载与解压**: 从可靠的源获取JDK11的绿色解压版,如“jdk11.0.2”文件。将压缩包下载到本地,然后选择合适的位置进行解压缩,例如“C:\Program Files\Java”。 2. **配置环境变量**: 这一步对于让系统识别JDK...