用过java做压缩或解压的都知道,jdk提供的zip只能按UTF-8格式处理,所有jdk提供的zip不能支持中文文件名采用Apache的zip包解决中文文件名问题(依赖 ant-1.9.6.jar)
<dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> </dependency>
工具类:
package com.tzz.util; 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.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** * ZIP工具包(支持中文) * 依赖:ant-1.9.6.jar */ public class CHZipUtils { /**使用GBK编码可以避免压缩中文文件名乱码*/ private static final String CHINESE_CHARSET = "GBK"; /**文件读取缓冲区大小*/ private static final int CACHE_SIZE = 1024; /** * 压缩文件 * @param sourceFolder 压缩文件夹 * @param zipFilePath 压缩文件输出路径 */ public static void zip(String sourceFolder, String zipFilePath) { OutputStream os = null; BufferedOutputStream bos = null; ZipOutputStream zos = null; try { os = new FileOutputStream(zipFilePath); bos = new BufferedOutputStream(os); zos = new ZipOutputStream(bos); // 解决中文文件名乱码 zos.setEncoding(CHINESE_CHARSET); File file = new File(sourceFolder); String basePath = null; if (file.isDirectory()) {//压缩文件夹 basePath = file.getPath(); } else { basePath = file.getParent(); } zipFile(file, basePath, zos); } catch (Exception e) { e.printStackTrace(); } finally{ try { if (zos != null) { zos.closeEntry(); zos.close(); } if (bos != null) { bos.close(); } if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 递归压缩文件 * @param parentFile * @param basePath * @param zos * @throws Exception */ private static void zipFile(File parentFile, String basePath, ZipOutputStream zos) throws Exception { File[] files = new File[0]; if (parentFile.isDirectory()) { files = parentFile.listFiles(); } else { files = new File[1]; files[0] = parentFile; } String pathName; InputStream is; BufferedInputStream bis; byte[] cache = new byte[CACHE_SIZE]; for (File file : files) { if (file.isDirectory()) { pathName = file.getPath().substring(basePath.length() + 1) + File.separator; zos.putNextEntry(new ZipEntry(pathName)); zipFile(file, basePath, zos); } else { pathName = file.getPath().substring(basePath.length() + 1); is = new FileInputStream(file); bis = new BufferedInputStream(is); zos.putNextEntry(new ZipEntry(pathName)); int nRead = 0; while ((nRead = bis.read(cache, 0, CACHE_SIZE)) != -1) { zos.write(cache, 0, nRead); } bis.close(); is.close(); } } } /** * 解压压缩包 * @param zipFilePath 压缩文件路径 * @param destDir 解压目录 */ public static void unZip(String zipFilePath, String destDir) { ZipFile zipFile = null; BufferedInputStream bis = null; FileOutputStream fos = null; BufferedOutputStream bos = null; try { zipFile = new ZipFile(zipFilePath, CHINESE_CHARSET); Enumeration<ZipEntry> zipEntries = zipFile.getEntries(); File file, parentFile; ZipEntry entry; byte[] cache = new byte[CACHE_SIZE]; while (zipEntries.hasMoreElements()) { entry = (ZipEntry) zipEntries.nextElement(); if (entry.isDirectory()) { new File(destDir + entry.getName()).mkdirs(); continue; } bis = new BufferedInputStream(zipFile.getInputStream(entry)); file = new File(destDir + entry.getName()); parentFile = file.getParentFile(); if (parentFile != null && (!parentFile.exists())) { parentFile.mkdirs(); } fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos, CACHE_SIZE); int readIndex = 0; while ((readIndex = bis.read(cache, 0, CACHE_SIZE)) != -1) { fos.write(cache, 0, readIndex); } bos.flush(); bos.close(); fos.close(); bis.close(); } } catch (IOException e) { e.printStackTrace(); }finally{ try { zipFile.close(); } catch (IOException e) { e.printStackTrace(); } } } }
测试:
package com.tzz.test.util; import com.tzz.util.CHZipUtils; public class CHZipUtilsTest { public static void main(String[] args) throws Exception { // String sourceFolder = "D:/test/1.txt"; // String sourceFolder = "D:/test/中文名.txt"; // String sourceFolder = "D:/test/cms"; String zipFilePath = "D:/test/zip/压缩多个文件.zip"; String unZipPath = "D:/test/unzip"; // CHZipUtils.zip(sourceFolder, zipFilePath); CHZipUtils.unZip(zipFilePath, unZipPath); System.out.println("********执行成功**********"); } }
相关推荐
尤其是在Windows系统下,文件名通常采用GB2312或GBK编码,而Java中的`ZipInputStream`和`ZipOutputStream`类默认使用的是Unicode编码,这种编码差异导致了中文文件名在压缩与解压过程中的乱码现象。 #### 二、解决...
本文将深入探讨如何使用Java实现ZIP文件的压缩与解压,重点讲解核心API,如`java.util.zip`包中的`ZipOutputStream`和`ZipInputStream`。 首先,我们来了解一下ZIP文件格式。ZIP是一种用于存储多个文件到一个单一...
本篇文章将详细探讨如何使用Java内置的IO流来实现文件夹的zip压缩以及zip压缩包的解压,无需依赖其他的第三方库如Apache Commons IO或JavaZip。 ### 文件夹压缩成ZIP 首先,我们需要理解如何将一个文件夹及其内容...
在Java编程中,处理文件压缩和解压是常见的任务,特别是使用ZIP格式。然而,当涉及到包含中文字符的文件或目录时,可能会遇到乱码问题。这个问题主要源于字符编码的不一致,通常需要正确设置字符集来确保中文字符在...
这个`Java zip 压缩/解压源码`的资源提供了一个简洁易用的API,使得开发者能够方便地对文件进行压缩和解压缩操作。下面我们将深入探讨Java中处理`zip`文件的相关知识。 1. **Java ZipFile类**: `java.util.zip....
总结来说,"java Zip压缩解压"涉及了Java标准库中的`java.util.zip`包,用于创建和读取ZIP文件;Apache Ant作为构建工具,可能用于自动化压缩和解压过程;而JUnit则用于编写和运行测试,确保代码的正确实现。在实际...
以上代码片段展示了如何利用Apache Commons IO库来处理中文乱码问题,使得在Java中进行ZIP文件的压缩和解压更加便捷和准确。在实际开发中,根据项目需求,可以选择使用标准库或者Apache Commons IO库,确保文件名和...
本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...
通过使用`ZipFile`和`ZipEntry`,我们可以方便地获取ZIP文件内的文件名,并结合多线程技术(如`ExecutorService`)来提高解压缩的效率。这样的实现方式使得在处理大量文件时,程序能够更快速、更高效地运行。
在Java标准库中,我们可以使用`java.util.zip`包中的`ZipInputStream`和`ZipEntry`来实现ZIP文件的解压。例如,你可以创建一个`ZipInputStream`对象,然后通过循环读取每个`ZipEntry`,将其写入目标文件系统。在处理...
在Java编程环境中,对目录和文件进行ZIP压缩与解压是一项常见的操作,特别是在处理大量数据或者需要进行文件传输时。本文将深入探讨如何使用Java来实现这一功能。 首先,我们需要了解ZIP文件格式,它是一种广泛使用...
本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip.ZipFile`类来实现解压功能。在实际应用中,这种方法非常实用...
### 使用 Java.util.zip 包实现数据压缩与解压 在计算机科学领域,数据压缩技术是一项重要的功能,它能够帮助减少存储空间的需求以及提高网络传输效率。本文将通过一系列的示例来详细介绍如何利用 Java 中的 `java....
本文将深入探讨如何在不解压的情况下直接读取ZIP文件,并特别关注如何处理包含中文文件名和内容乱码的问题。我们将以支付宝对账单为例,因为这类文件通常包含大量敏感和重要的财务信息,正确地读取和解析它们至关...
在Java编程环境中,处理压缩文件,特别是ZIP格式的文件...总的来说,解压包含中文文件名的ZIP文件在Java中可以通过正确设置编码和使用适当的库或工具来实现。理解文件名编码和选择合适的处理方法是解决这类问题的关键。
* @param zipFile 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ 方法详细见文件! 一个...
Java的`java.util.zip`包提供了对ZIP文件的支持,包括`ZipInputStream`和`ZipOutputStream`类用于读写ZIP文件,以及`ZipEntry`类来代表ZIP文件中的单个条目。当我们尝试用这些类解压含有中文名的文件时,如果未正确...
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有...
本文将详细讲解如何使用Java来解压和压缩tar包,同时解决在处理中文文件名时可能出现的乱码问题,主要关注`javatar-2.5.jar`库中的功能以及`TarUtil.java`类的应用。 首先,`javatar-2.5.jar`是一个专门用于处理tar...
在Java编程语言中,实现文件的压缩和解压是常见的任务,这有助于数据存储和传输。本示例将深入探讨如何使用Java的内置库来处理ZIP格式的压缩和解压缩。`java.util.zip`包提供了必要的类来实现这一功能。 首先,让...