0 0

解析zip时压缩文件内包含中文名称 ZipInputStream不能支持中文如何解决5

图中圈住部分报错,应该就是由于文件名称包含中文导致,网上说需要修改ZipInputStream类,这个方法大神们就不要说了,需要别的方案并且详细一下,分很多可以追加!!!

 


问题补充:public String unzip(Model model,MultipartFile file, HttpServletRequest request, HttpServletResponse response){
ZipEntry z;
try{
ZipInputStream in = new ZipInputStream(file.getInputStream());
while ((z = in.getNextEntry()) != null) {
2014年8月06日 11:28
  • 大小: 40.1 KB

5个答案 按时间排序 按投票排序

0 0

采纳的答案

需要导入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");  
    }  
}

2014年8月07日 09:16
0 0

建议使用ant的api,jdk原生的api太弱了。

我以前写过工具类,文中上面是基于JDK的压缩工具类,下面是基于ant的压缩工具类:
[u=/blog/1480293]http://yunzhu.iteye.com/blog/1480293[/u]

2014年8月07日 09:15
0 0

1:须贴出错误trace,
2:ZipInputStream的作用
This class implements an input stream filter for reading files in the
ZIP file format.
3:通过2,须确认MultipartFile file所引用的文件时Zip文件类型?

2014年8月06日 16:24
0 0

建议使用ant包中的api里解压,具体使用可以baidu一下。

2014年8月06日 14:52
0 0

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();
			}
		}

2014年8月06日 12:15

相关推荐

    ZipInputStream解压有中文名报错问题解决

    这个问题通常表现为乱码或者无法正确解压,因为默认情况下,`ZipInputStream`可能不支持非ASCII字符集,尤其是中文字符,这些字符在编码和解码过程中可能会出现错误。 要解决这个bug,我们需要理解几个关键的概念:...

    详解Java无需解压直接读取Zip文件和文件内容

    Java无需解压直接读取Zip文件和文件内容是Java语言中的一种常见操作,通过使用java.util.zip包中的ZipFile、ZipInputStream和ZipEntry类,我们可以轻松地读取Zip文件和文件内容。下面,我们将详细介绍如何使用Java...

    java解压zip 可包含中文文件

    为了解决这个问题,我们需要在读取和写入文件名时明确指定编码,通常是UTF-8,因为UTF-8编码可以支持包括中文在内的大多数字符集。 下面是一个使用Java标准库解压ZIP文件的例子,同时处理中文文件名: ```java ...

    java zipentry.jar 解决解压失败问题

    在本例中,虽然没有具体的压缩包子文件的文件名称列表,但上述解决方案适用于任何包含中文文件名的ZIP文件。通过遵循这些最佳实践,你可以在Java环境中成功地解压和处理包含非ASCII字符的压缩文件。

    Java压缩文件目录成ZIP包最新技巧

    本文将详细介绍如何使用`java.util.zip`包中的类来压缩文件及目录,并解决其中的一个常见问题——中文文件名或目录名的支持问题。 #### 一、Java自带压缩工具简介 Java标准库提供了`java.util.zip`包来处理文件的...

    java解压缩ZIP文件

    总之,通过合理利用`ZipEntry`、`ZipOutputStream`和`ZipInputStream`这三个核心类,我们可以在Java中轻松实现ZIP文件的压缩与解压缩功能,这对于处理大量文件或进行网络传输时的数据压缩尤为重要。

    java对zip、rar文件的压缩和解压缩

    ### Java对ZIP、RAR文件的压缩与解压缩技术解析 #### 概述 在实际开发过程中,文件的压缩与解压缩是一项非常常见的需求。本文将详细介绍如何使用Java语言实现ZIP和RAR格式文件的压缩与解压缩操作。文章通过具体的...

    根据java.util.zip源码修改zip支持中文

    标题"根据java.util.zip源码修改zip支持中文"指的是开发者可能遇到了Java标准库在处理包含中文字符的ZIP文件时的问题,并尝试通过修改`java.util.zip`的源代码来解决这个问题。这通常涉及到对ZIP文件结构的理解以及...

    java jar包 ZIp压缩解压 数据库连接驱动 XML解析

    在Java编程领域,有三个关键知识点紧密关联:Java JAR包、ZIP压缩解压和XML解析,以及数据库连接驱动。让我们逐一深入探讨这些主题。 首先,Java JAR(Java Archive)包是Java平台的一种归档格式,用于集合多个类...

    ZIP文件解压与压缩

    标题中的"ZIP文件解压与压缩"涉及到的是计算机文件处理技术,主要集中在如何对ZIP格式的文件进行压缩和解压缩操作。ZIP是一种广泛使用的文件压缩格式,它允许将多个文件和目录打包到一个单一的ZIP文件中,以节省存储...

    解压ZIP文件,通用解压器

    - **初始化文件流**:通过`FileInputStream`读取ZIP文件,并创建`ZipInputStream`对象来解析ZIP文件。 - **遍历ZIP文件条目**:使用`getNextEntry()`方法获取ZIP文件中的下一个条目,直到没有更多条目为止。 - **...

    仿zip压缩软件的java代码|zip.rar

    本项目是作者使用Eclipse开发的一个简单但功能齐全的ZIP压缩与解压缩工具,它包含了文件分割、进度条显示以及图形用户界面(GUI)。 【描述】:该项目的核心在于理解ZIP文件格式规范和Java的I/O流以及压缩算法。...

    java版zip压缩解压代码

    这个程序主要利用了Java的内置库,尤其是`java.util.zip`包中的类,如`ZipOutputStream`和`ZipInputStream`,来实现对文件和文件夹的ZIP压缩与解压操作。以下是关于这些知识点的详细说明: 1. **ZipOutputStream**:...

    压缩文件(.rar/.zip)解压

    此过程涉及多个步骤和技术要点,包括但不限于处理文件输入输出流、利用`java.util.zip`包中的类进行解压缩操作以及递归删除文件夹等。 ### 压缩文件(.rar/.zip)解压 #### 核心概念介绍 1. **压缩文件**:通常用于...

    java+apache完成zip压缩源码(包括修改后的java.util.zip下的源码)

    Apache Commons Compress库是另一个值得考虑的工具,它提供了更高级的文件压缩功能,包括对ZIP格式的支持。Apache Commons Compress不仅解决了中文文件名的问题,还支持多种压缩格式,如GZIP、BZIP2等。使用这个库...

    ztp.zip_zip

    这在构建和解析ZIP文件时非常关键,因为ZIP文件可以包含嵌套的目录。 6. **枚举和迭代**:"ContextEnumerator.java"和"LazySearchEnumerationImpl.java"可能实现了枚举接口,允许按顺序访问文件或目录。枚举和迭代...

    JAVA文件压缩与解压缩实践(源代码+论文).zip

    ZIP格式允许在一个文件中存储多个独立的压缩文件,这在创建归档文件时非常有用。你可以添加、删除或更新ZIP文件中的条目。 3. **Deflater与Inflater**: 对于更底层的控制,你可以使用`java.util.zip.Deflater`...

    文件管理器源码,文件拖曳,list弹性,root ,zip压缩解(实用1).zip

    压缩文件时,可以将文件流写入`ZipOutputStream`;解压缩时,则从`ZipInputStream`读取。此外,`ZipFile`类提供了解析已存在Zip文件的能力。为了提高用户体验,通常会添加进度条来显示压缩或解压过程的进度。 以上...

    FTP文件上传下载CSV文件生成ZIP压缩

    在Java中,我们可以利用java.util.zip包中的ZipOutputStream和ZipInputStream来创建和读取ZIP文件。FileZipUtils可能会提供将一组文件或目录压缩成ZIP,或将ZIP文件解压缩到指定目录的方法。 最后,IOUtil.java可能...

    Java解析pdf,zip,doc等格式文档

    Java的jar工具和zip工具提供了命令行接口进行文件的压缩和解压缩,而在代码中,可以使用java.util.zip包的ZipInputStream和ZipOutputStream来实现这一功能。解压过程通常是创建一个输入流,然后读取每个条目并写入...

Global site tag (gtag.js) - Google Analytics