图中圈住部分报错,应该就是由于文件名称包含中文导致,网上说需要修改ZipInputStream类,这个方法大神们就不要说了,需要别的方案并且详细一下,分很多可以追加!!!
图中圈住部分报错,应该就是由于文件名称包含中文导致,网上说需要修改ZipInputStream类,这个方法大神们就不要说了,需要别的方案并且详细一下,分很多可以追加!!!
需要导入ant.jar
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.io.InputStream; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** * 基于Ant的Zip压缩工具类 * * @author 陈峰 */ public class AntZipUtils { public static final String ENCODING_DEFAULT = "UTF-8"; public static final int BUFFER_SIZE_DIFAULT = 128; public static void makeZip(String[] inFilePaths, String zipPath) throws Exception { makeZip(inFilePaths, zipPath, ENCODING_DEFAULT); } public static void makeZip(String[] inFilePaths, String zipPath, String encoding) throws Exception { File[] inFiles = new File[inFilePaths.length]; for (int i = 0; i < inFilePaths.length; i++) { inFiles[i] = new File(inFilePaths[i]); } makeZip(inFiles, zipPath, encoding); } public static void makeZip(File[] inFiles, String zipPath) throws Exception { makeZip(inFiles, zipPath, ENCODING_DEFAULT); } public static void makeZip(File[] inFiles, String zipPath, String encoding) throws Exception { ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream( new FileOutputStream(zipPath))); zipOut.setEncoding(encoding); for (int i = 0; i < inFiles.length; i++) { File file = inFiles[i]; doZipFile(zipOut, file, file.getParent()); } zipOut.flush(); zipOut.close(); } private static void doZipFile(ZipOutputStream zipOut, File file, String dirPath) throws FileNotFoundException, IOException { if (file.isFile()) { BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file)); String zipName = file.getPath().substring(dirPath.length()); while (zipName.charAt(0) == '\\' || zipName.charAt(0) == '/') { zipName = zipName.substring(1); } ZipEntry entry = new ZipEntry(zipName); zipOut.putNextEntry(entry); byte[] buff = new byte[BUFFER_SIZE_DIFAULT]; int size; while ((size = bis.read(buff, 0, buff.length)) != -1) { zipOut.write(buff, 0, size); } zipOut.closeEntry(); bis.close(); } else { File[] subFiles = file.listFiles(); for (File subFile : subFiles) { doZipFile(zipOut, subFile, dirPath); } } } public static void unZip(String zipFilePath, String storePath) throws IOException { unZip(new File(zipFilePath), storePath); } public static void unZip(File zipFile, String storePath) throws IOException { if (new File(storePath).exists()) { new File(storePath).delete(); } new File(storePath).mkdirs(); ZipFile zip = new ZipFile(zipFile); Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip .getEntries(); while (entries.hasMoreElements()) { ZipEntry zipEntry = entries.nextElement(); if (zipEntry.isDirectory()) { // TODO } else { String zipEntryName = zipEntry.getName(); if (zipEntryName.indexOf(File.separator) > 0) { String zipEntryDir = zipEntryName.substring(0, zipEntryName .lastIndexOf(File.separator) + 1); String unzipFileDir = storePath + File.separator + zipEntryDir; File unzipFileDirFile = new File(unzipFileDir); if (!unzipFileDirFile.exists()) { unzipFileDirFile.mkdirs(); } } InputStream is = zip.getInputStream(zipEntry); FileOutputStream fos = new FileOutputStream(new File(storePath + File.separator + zipEntryName)); byte[] buff = new byte[BUFFER_SIZE_DIFAULT]; int size; while ((size = is.read(buff)) > 0) { fos.write(buff, 0, size); } fos.flush(); fos.close(); is.close(); } } } public static void main(String[] args) throws Exception { String rootDir = "D:\\chenfeng"; String zipPath = "D:\\ZipDemo.zip"; // File[] inFiles = new File(rootDir).listFiles(); // makeZip(inFiles, zipPath); makeZip(new String[] { rootDir }, zipPath); unZip(zipPath, "D:\\chenfeng_zip"); } }
建议使用ant的api,jdk原生的api太弱了。
我以前写过工具类,文中上面是基于JDK的压缩工具类,下面是基于ant的压缩工具类:
[u=/blog/1480293]http://yunzhu.iteye.com/blog/1480293[/u]
1:须贴出错误trace,
2:ZipInputStream的作用
This class implements an input stream filter for reading files in the
ZIP file format.
3:通过2,须确认MultipartFile file所引用的文件时Zip文件类型?
zip可以指定字符编码的
FileOutputStream fos = null; ZipOutputStream zos = null; try { fos = new FileOutputStream(zipFilePath); zos = new ZipOutputStream(fos); zos.setEncoding("GBK"); writeZipFile(new File(filePath), zos, "",FileNames); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { if (zos != null) zos.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } }
相关推荐
这个问题通常表现为乱码或者无法正确解压,因为默认情况下,`ZipInputStream`可能不支持非ASCII字符集,尤其是中文字符,这些字符在编码和解码过程中可能会出现错误。 要解决这个bug,我们需要理解几个关键的概念:...
Java无需解压直接读取Zip文件和文件内容是Java语言中的一种常见操作,通过使用java.util.zip包中的ZipFile、ZipInputStream和ZipEntry类,我们可以轻松地读取Zip文件和文件内容。下面,我们将详细介绍如何使用Java...
在本例中,虽然没有具体的压缩包子文件的文件名称列表,但上述解决方案适用于任何包含中文文件名的ZIP文件。通过遵循这些最佳实践,你可以在Java环境中成功地解压和处理包含非ASCII字符的压缩文件。
为了解决这个问题,我们需要在读取和写入文件名时明确指定编码,通常是UTF-8,因为UTF-8编码可以支持包括中文在内的大多数字符集。 下面是一个使用Java标准库解压ZIP文件的例子,同时处理中文文件名: ```java ...
本文将详细介绍如何使用`java.util.zip`包中的类来压缩文件及目录,并解决其中的一个常见问题——中文文件名或目录名的支持问题。 #### 一、Java自带压缩工具简介 Java标准库提供了`java.util.zip`包来处理文件的...
总之,通过合理利用`ZipEntry`、`ZipOutputStream`和`ZipInputStream`这三个核心类,我们可以在Java中轻松实现ZIP文件的压缩与解压缩功能,这对于处理大量文件或进行网络传输时的数据压缩尤为重要。
### Java对ZIP、RAR文件的压缩与解压缩技术解析 #### 概述 在实际开发过程中,文件的压缩与解压缩是一项非常常见的需求。本文将详细介绍如何使用Java语言实现ZIP和RAR格式文件的压缩与解压缩操作。文章通过具体的...
标题"根据java.util.zip源码修改zip支持中文"指的是开发者可能遇到了Java标准库在处理包含中文字符的ZIP文件时的问题,并尝试通过修改`java.util.zip`的源代码来解决这个问题。这通常涉及到对ZIP文件结构的理解以及...
在Java编程领域,有三个关键知识点紧密关联:Java JAR包、ZIP压缩解压和XML解析,以及数据库连接驱动。让我们逐一深入探讨这些主题。 首先,Java JAR(Java Archive)包是Java平台的一种归档格式,用于集合多个类...
标题中的"ZIP文件解压与压缩"涉及到的是计算机文件处理技术,主要集中在如何对ZIP格式的文件进行压缩和解压缩操作。ZIP是一种广泛使用的文件压缩格式,它允许将多个文件和目录打包到一个单一的ZIP文件中,以节省存储...
- **初始化文件流**:通过`FileInputStream`读取ZIP文件,并创建`ZipInputStream`对象来解析ZIP文件。 - **遍历ZIP文件条目**:使用`getNextEntry()`方法获取ZIP文件中的下一个条目,直到没有更多条目为止。 - **...
本项目是作者使用Eclipse开发的一个简单但功能齐全的ZIP压缩与解压缩工具,它包含了文件分割、进度条显示以及图形用户界面(GUI)。 【描述】:该项目的核心在于理解ZIP文件格式规范和Java的I/O流以及压缩算法。...
这个程序主要利用了Java的内置库,尤其是`java.util.zip`包中的类,如`ZipOutputStream`和`ZipInputStream`,来实现对文件和文件夹的ZIP压缩与解压操作。以下是关于这些知识点的详细说明: 1. **ZipOutputStream**:...
此过程涉及多个步骤和技术要点,包括但不限于处理文件输入输出流、利用`java.util.zip`包中的类进行解压缩操作以及递归删除文件夹等。 ### 压缩文件(.rar/.zip)解压 #### 核心概念介绍 1. **压缩文件**:通常用于...
Apache Commons Compress库是另一个值得考虑的工具,它提供了更高级的文件压缩功能,包括对ZIP格式的支持。Apache Commons Compress不仅解决了中文文件名的问题,还支持多种压缩格式,如GZIP、BZIP2等。使用这个库...
这在构建和解析ZIP文件时非常关键,因为ZIP文件可以包含嵌套的目录。 6. **枚举和迭代**:"ContextEnumerator.java"和"LazySearchEnumerationImpl.java"可能实现了枚举接口,允许按顺序访问文件或目录。枚举和迭代...
ZIP格式允许在一个文件中存储多个独立的压缩文件,这在创建归档文件时非常有用。你可以添加、删除或更新ZIP文件中的条目。 3. **Deflater与Inflater**: 对于更底层的控制,你可以使用`java.util.zip.Deflater`...
对于上传RAR和ZIP文件的解压,Java标准库提供了`java.util.zip`包,包含`ZipInputStream`和`ZipFile`类来处理ZIP文件,而RAR文件则需要第三方库如Apache Commons Compress。下面是一个解压ZIP文件的例子: ```java ...
压缩文件时,可以将文件流写入`ZipOutputStream`;解压缩时,则从`ZipInputStream`读取。此外,`ZipFile`类提供了解析已存在Zip文件的能力。为了提高用户体验,通常会添加进度条来显示压缩或解压过程的进度。 以上...
在Java中,我们可以利用java.util.zip包中的ZipOutputStream和ZipInputStream来创建和读取ZIP文件。FileZipUtils可能会提供将一组文件或目录压缩成ZIP,或将ZIP文件解压缩到指定目录的方法。 最后,IOUtil.java可能...