JDK中自带的ZipOutputStream在压缩文件时,如果文件名中有中文,则压缩后的
zip文件打开时发现中文文件名变成乱码.
解决的方法是使用apache-ant-zip.jar包(见附件)中的ZipOutputStream和ZipEntry.
即,导入类:
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
并且注意,压缩之前调用ZipOutputStream的out.setEncoding(System.getProperty("sun.jnu.encoding"));方法,
系统参数sun.jnu.encoding表示获取当前系统中的文件名的编码方式.这里将ZipOutputStream的文件名编码方式
设置成系统的文件名编码方式.
解压时,直接使用JDK原来的ZipInputStream即可.
但是有个需要注意的地方是,在读取ZIP文件之前,需要设置:
System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));
将系统的ZIP编码格式设置为系统文件名编码方式,否则解压时报异常.
(网上,还有修改ZipInputStream源码的方式貌似太麻烦了,参考:http://zwllxs.iteye.com/blog/871260)
ZIP代码参考http://szhnet.iteye.com/blog/199059,有修改.
package io; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; public class Zip { static final int BUFFER = 8192; public Zip() { } private static void compress(File file, ZipOutputStream out, String basedir) { /* 判断是目录还是文件 */ if (file.isDirectory()) { // System.out.println("压缩:" + basedir + file.getName()); compressDirectory(file, out, basedir); } else { // System.out.println("压缩:" + basedir + file.getName()); compressFile(file, out, basedir); } } /** 压缩一个目录 */ private static void compressDirectory(File dir, ZipOutputStream out, String basedir) { if (!dir.exists()) return; File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { /* 递归 */ compress(files[i], out, basedir + dir.getName() + "/"); } } /** 压缩一个文件 */ private static void compressFile(File file, ZipOutputStream out, String basedir) { if (!file.exists()) { return; } try { BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); ZipEntry entry = new ZipEntry(basedir + file.getName()); out.putNextEntry(entry); int count; byte data[] = new byte[BUFFER]; while ((count = bis.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } bis.close(); } catch (Exception e) { throw new RuntimeException(e); } } public static void zip(String srcPathName, String zipFileName) { File file = new File(srcPathName); File zipFile = new File(zipFileName); if (!file.exists()) throw new RuntimeException(srcPathName + "不存在!"); try { FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); ZipOutputStream out = new ZipOutputStream(cos); out.setEncoding(System.getProperty("sun.jnu.encoding"));//设置文件名编码方式 String basedir = ""; compress(file, out, basedir); out.close(); } catch (Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) { Zip.zip("D:\\D\\dll", "D:\\D\\dll.zip"); } }
UnZip代码:
package io; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class UnZip { public static void unzip(String zipFilePath, String destDir) { System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding")); //防止文件名中有中文时出错 //System.out.println(System.getProperty("sun.zip.encoding")); //ZIP编码方式 //System.out.println(System.getProperty("sun.jnu.encoding")); //当前文件编码方式 //System.out.println(System.getProperty("file.encoding")); //这个是当前文件内容编码方式 File dir = new File(destDir); // create output directory if it doesn't exist if (!dir.exists()) dir.mkdirs(); FileInputStream fis; // buffer for read and write data to file byte[] buffer = new byte[1024]; try { fis = new FileInputStream(zipFilePath); ZipInputStream zis = new ZipInputStream(fis); ZipEntry ze = zis.getNextEntry(); while (ze != null) { String fileName = ze.getName(); File newFile = new File(destDir + File.separator + fileName); //System.out.println("Unzipping to " + newFile.getAbsolutePath()); // create directories for sub directories in zip new File(newFile.getParent()).mkdirs(); FileOutputStream fos = new FileOutputStream(newFile); int len; while ((len = zis.read(buffer)) > 0) { fos.write(buffer, 0, len); } fos.close(); // close this ZipEntry zis.closeEntry(); ze = zis.getNextEntry(); } // close last ZipEntry zis.closeEntry(); zis.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { String zipFilePath = "D:\\D\\dll.zip"; String destDir = "D:\\D\\dll_zip"; UnZip.unzip(zipFilePath, destDir); } }
相关推荐
本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...
在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...
本文将深入探讨如何使用SharpCompress这一开源库来处理ZIP和RAR文件,并解决在处理中文文件名时可能出现的乱码问题。 SharpCompress是一款强大的、跨平台的压缩库,支持多种压缩格式,包括ZIP、TAR、GZIP、BZIP2、7...
在Java编程环境中,处理压缩和解压缩文件是一项常见的任务,特别是在需要打包或传输大量数据时。本篇文章将详细探讨如何使用Java内置的类库来实现ZIP文件的压缩和解压缩,以及解决中文文件名出现乱码的问题。 首先...
总结,ICSharpCode.SharpZipLib通过设置正确的编码参数,可以有效地解决在处理中文文件名时出现的乱码问题。在创建和解压缩ZIP文件时,应特别注意文件名和内容的编码设置,以确保数据的完整性和正确性。
Apache Commons Compress库是Java中一个强大的工具,它提供了对多种压缩格式的支持,包括zip,而且能够处理中文文件名的问题,避免了因为字符编码不正确导致的乱码问题。 首先,我们要了解Java内置的`java.util.zip...
总的来说,解决Java压缩中文乱码问题的关键在于正确处理文件名的编码,确保使用UTF-8编码,并在必要时自定义压缩和解压缩流。通过上述方法,即使不依赖第三方库,也可以在Java程序中实现对中文文件名的完美支持。
总结一下,Apache Commons Compress库是Java中处理压缩和解压缩任务的理想选择,尤其是对于处理包含中文文件名的压缩文件。通过`ZipArchiveOutputStream`和`ZipArchiveInputStream`,我们可以方便地实现对文件或...
通过对JDK的java.util.zip下的ZipInputStream和ZipOutputStream类进行改造,彻底解决压缩和解压缩文件时的中文文件名乱码问题。 包含已大好的jar包,以及一个如何使用的Demo程序。
总结来说,Java处理中文文件名的关键在于了解编码的使用,并在创建、读取和压缩文件时正确地进行编码和解码。确保始终使用与文件系统和压缩格式兼容的编码,这样可以避免乱码问题。对于非标准格式如RAR,可能需要...
因此,如果ZIP文件中的文件名包含中文,使用`java.util.zip`进行操作时,中文文件名可能会出现乱码。为了解决这个问题,开发者需要手动设置正确的字符编码,通常是UTF-8,来确保中文文件名能够正确处理。 Ant是一个...
这个库特别强调了解决中文文件名乱码的问题,确保在处理包含非ASCII字符的文件名时,能够正确显示和保存。 在Java中,处理tar文件通常需要使用`java.util.zip`和`java.io`这两个包,但这些基础类库并不直接支持tar...
在Java编程环境中,压缩和解压缩文件是一项常见的任务,尤其在数据传输、备份或存储时。本项目名为“压缩工具类改良版(解决中文乱码)”,它专注于解决使用`ZipEntry`进行文件压缩时遇到的中文乱码问题。这个问题...
本文将深入探讨如何使用Java在Android环境中处理这些任务,特别是解决中文文件名在压缩和解压缩过程中可能出现的乱码问题。 首先,让我们关注文件的下载和上传。在Android中,我们可以使用`java.net.URL`和`java...
在Java编程中,处理压缩和解压缩文件是常见的任务,特别是在构建自动化工具、数据传输或者存储优化场景下。本主题将深入讲解如何使用Java来解压缩ZIP文件,并介绍相关库和具体实现方法。 标题提到的"java解压缩zip...
在Java编程语言中,处理...通过上述方法,我们可以使用Java实现一个功能完善的、能够处理中文文件名的压缩和解压缩工具,避免出现乱码问题。这个工具对于处理包含中文字符的文件尤其有用,确保在不同环境下的正确性。
在IT行业中,压缩和解压缩文件是常见的操作,特别是在数据传输和存储时。"支持中文的zip压缩解压"这个话题对于处理包含中文文件名或路径的文件集合尤其重要。在许多编程语言中,包括Java,处理中文字符可能会遇到...
"多文件压缩zip"是指将多个文件合并成一个单一的压缩文件,通常以.zip格式。这个主题涵盖了解压缩过程,以及如何处理中文乱码问题。本文将深入探讨相关知识点。 首先,我们来了解ZIP文件格式。ZIP是一种广泛使用的...
标题提到的"java压缩文件时的依赖jar包"很可能指的是用来解决此类问题的特定库。在这种情况下,`ant.jar`是一个关键的角色,它是Apache Ant项目的组成部分,它是一个基于Java的任务执行框架,常用于构建和部署项目,...