`

Zip文件解析(包含中文目录)

阅读更多

在解析zip文件时,由于默认版本不支持中文目录,导致解析时遇到中文文件目录会出现乱码:

从网上找到一些资料,自己写了个样例。有兴趣的可以看看。(需要修改原有的zip包,添加构造方法,支持gbk编码)

具体修改class为 ZipinputStream和ZipOutputStream(代码见附件中)

见下方压缩与解析代码:

 

package ziphandle;

 

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.LinkedList;

import java.util.List;

import java.util.Map;

import java.util.Set;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

import org.apache.commons.lang.ArrayUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import org.springframework.transaction.annotation.Transactional;

 

 

import zip.ZipEntry;

import zip.ZipInputStream;

import zip.ZipOutputStream;

 

@Transactional

@Component

public class FileHandle {

 

public static void zip(File outZipPath, File zipFileRoot) {

try {

// filePath.

OutputStream os = new FileOutputStream(outZipPath);

BufferedOutputStream bos = new BufferedOutputStream(os);

ZipOutputStream zip = new ZipOutputStream(bos, "GBK");

zip(zip, zipFileRoot, "");

zip.flush();

zip.closeEntry();

zip.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

 

/*

* 写入文件目录与文件内容

*/

private static void zip(ZipOutputStream out, File f, String base) throws Exception {

System.out.println("Zipping  " + f.getName());

if (f.isDirectory()) {

File[] fl = f.listFiles();

// base = new String(base.getBytes(), "GBK");

out.putNextEntry(new ZipEntry(base + "/"));

base = base.length() == 0 ? "" : base + "/";

for (int i = 0; i < fl.length; i++) {

zip(out, fl[i], base + fl[i].getName());

}

} else if (!f.getName().endsWith(".zip")) {

// base = new String(base.getBytes(), "GBK");

out.putNextEntry(new ZipEntry(base));

BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));

byte[] bt = new byte[1024];

int b;

while ((b = in.read(bt)) != -1) {

out.write(bt, 0, b);

}

in.close();

}

}

 

@Transactional

public void unzip(String zipFileName) throws Exception {

ZipInputStream in = null;

try {

in = new ZipInputStream(new FileInputStream(zipFileName), "gbk");

ZipEntry z;

int totalCount = 0;

while ((z = in.getNextEntry()) != null) {

if (z.isDirectory()) {

String name = z.getName();

if (StringUtils.isNotBlank(name)) {

System.out.println("目录:" + name);

int index = name.lastIndexOf("/");

String currentName = null;

String parentName = null;

if (index != -1) {

currentName = name.substring(index + 1, name.length());

parentName = name.substring(0, index);

} else {

currentName = name;

}

 

currentName = currentName.substring(0, name.length() - 1); //去掉斜线

System.out.println("输出目录名称:"+currentName);

}

} else {

String name = z.getName();

System.out.println("文件名:" + name);

if (StringUtils.isNotBlank(name)) {

String currentName = null;

String parentName = null;

int index = name.lastIndexOf("/");

if (index != -1) {

currentName = name.substring(index + 1, name.length());

parentName = name.substring(0, index);

} else {

currentName = name;

}

BufferedReader br = new BufferedReader(new InputStreamReader(in));

String b;

int row = 0;

while ((b = br.readLine()) != null) {

totalCount++;

row++;

System.out.println("读出文件内容:"+b);  //打出读取的内容

 

}

System.out.println("读取文件 " + currentName + " 结束");

}

}

}

} catch (Exception e) {

throw e;

} finally {

in.close();

File tempFile = new File(zipFileName);

tempFile.delete();

tempFile.deleteOnExit();

}

 

}

 

public static void main(String[] args) {

try {

// OutputStream os = new FileOutputStream(new File("D:/中文new.zip"));

// BufferedOutputStream bos = new BufferedOutputStream(os);

// ZipOutputStream zip = new ZipOutputStream(bos, "GBK");

// zip(zip, new File("D://中文"), "");

// zip.flush();

// zip.closeEntry();

// zip.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}


需要用到的修改后的zip包,见附件
  • zip.zip (14.3 KB)
  • 下载次数: 6
0
0
分享到:
评论
1 楼 JetMah 2012-12-11  
Mark~

相关推荐

    将一个目录内的内容打包到zip文件以及将zip文件解压到某个目录(ZipPack).zip

    本资源提供的"将一个目录内的内容打包到zip文件以及将zip文件解压到某个目录(ZipPack).zip"是一个Windows下的C++实现,它利用了zlib库来处理zip文件的相关操作。下面将详细阐述涉及的知识点。 1. **C++编程语言**:...

    C++实现ZIP文件解压

    ZIP文件通常包含一个中央目录,存储了所有压缩文件的元数据,如文件名、时间戳、压缩方法以及在ZIP文件内的位置。此外,每个文件的压缩数据分布在文件的前面部分。 1. **读取ZIP文件头**:解压过程的第一步是识别...

    Zip文件目录遍历漏洞demo

    Zip文件目录遍历漏洞是一种常见的安全问题,主要发生在处理或解析ZIP格式的压缩文件时。在本Demo中,我们将深入探讨这种漏洞的本质、其产生的原因以及如何防范。 ZIP是一种广泛使用的文件压缩格式,它允许用户将多...

    读取zip文件,不解压缩直接解析,支持文件名中文,解决内容乱码(还是以支付宝对账单为例)

    对于支持中文文件名,这些库通常已经处理了Unicode编码,以确保正确解析非ASCII字符,包括中文。 在读取ZIP文件时,我们首先需要打开ZIP文件并创建一个ZIP文件对象。然后,通过迭代这个对象,我们可以访问每个条目...

    解压zip文件和复制一个目录下所有文件到另一个目录

    本项目聚焦于使用C++来处理文件操作,具体包括解压ZIP文件和复制文件到另一目录。以下是对这些知识点的详细说明: 1. **解压ZIP文件**: ZIP是一种常见的文件压缩格式,它允许将多个文件和目录打包成一个单一的可...

    获取zip文件编码格式 cpdetector.zip

    在这个场景中,ANTLR可能被用来解析ZIP文件的内容,以便进一步处理其中的文本文件。 `cpdetector-1.08.jar` 是Character Profile Detector的实现,它是一个Java库,专门用于检测文本文件的字符编码。这个库提供了...

    JAVA解压ZIP多层目录文件(需ant.jar

    本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip.ZipFile`类来实现解压功能。在实际应用中,这种方法非常实用...

    ABAP从FTP下载文件并解析到内表移动文件位置.zip

    在这里,`lt_files_info`会包含ZIP文件内的所有文件信息,包括文件名和数据。 然后,将ZIP文件内容解析到内表,我们可以遍历`lt_files_info`,读取每个文件的内容,并将其转换为字符格式存储到内表中。例如: ```...

    前端解析EXCEL.zip

    本文将详细探讨如何使用纯JavaScript在前端解析Excel文件,不依赖后端服务,且兼容各大主流浏览器。我们将主要关注以下几个关键知识点: 1. **Excel文件格式**: Excel文件通常以`.xlsx`为扩展名,采用OpenXML标准...

    actionscript解析zip包

    4. **解析Zip文件**:使用库提供的API,可以读取Zip文件的中央目录,获取所有文件的信息,然后根据需要解压特定文件。这可能涉及到二进制数据的处理,如使用`ByteArray`对象来存储和操作文件数据。 5. **压缩和写入...

    凯立德2012配置文件解析与参考.zip

    凯立德2012配置文件解析与参考.exe很可能是提供这类教程或工具的可执行文件,它可能包括配置文件的详细说明、修改指南、示例和实用工具。通过运行这个程序,用户可以系统地学习和实践配置文件的解析和应用,从而更好...

    ActionScript解析Zip文件的资源包

    - Zip文件中的文件路径可能包含相对路径,处理时需要正确解析和构建完整的文件路径。 - 文件编码问题,某些文本文件可能需要根据编码类型(如UTF-8)进行解码。 - 对于大文件,可能需要考虑分块读取,以避免一次...

    poi.zip java读取excel文件

    在本案例中,提供的压缩包 "poi.zip" 包含了两个子文件:poi-bin-4.1.0-20190412.zip 和 poi-src-4.1.0-20190412.zip。 **Apache POI 概述** Apache POI 是 Apache 软件基金会的一个项目,它提供了一个 Java API,...

    基于C#开发的STEP文件解析器完整源码+项目说明(毕设项目).zip

    基于C#开发的STEP文件解析器完整源码+项目说明(毕设项目).zip 【资源介绍】 此项目是本人的毕业设计的研究课题,旨在实现一个STEP解析器,预期功能如下: 解析STEP文件,识别出各组成元素的类型、详细信息,以及元素...

    凯立德配置文件解析与参考V5.0.zip

    "凯立德配置文件解析与参考V5.0.zip" 是一个针对凯立德导航系统配置文件的解析工具和参考资料的压缩包,主要针对的是2012年的版本。这个压缩包中包含了两个文件,一个是执行程序"凯立德2012配置文件解析与参考.exe...

    java解压zip 可包含中文文件

    在上述代码中,我们创建了一个`ZipInputStream`实例,传入ZIP文件路径和UTF-8编码,确保文件名可以正确解析。然后,遍历ZIP文件中的每个条目,根据条目是否为目录创建相应的文件或目录,同时使用UTF-8编码创建文件名...

    iOS原生文件系统解析.zip

    1. iOS的HFS+文件系统基础,包括文件和目录结构。 2. iOS的沙盒机制,如何保护用户数据和应用间的隔离。 3. 文件系统的安全性,如读写权限和数据加密。 4. 应用如Pages如何与文件系统交互,处理文档的存储和访问。 5...

    使用java处理zip文件

    一旦你有了`ZipFile`对象,你可以通过`entries()`方法获取一个`Enumeration&lt;ZipEntry&gt;`,它包含ZIP文件中的所有条目(即文件和目录)。`ZipEntry`对象提供了关于ZIP条目的详细信息,如名称、大小、时间戳等。 ```...

    解压ZIP文件,通用解压器

    解压ZIP文件的过程是将压缩包中的文件恢复到原始状态,以便用户可以访问其中包含的文件和目录结构。通常,解压过程会涉及到读取ZIP文件头信息、提取压缩数据并将其写入磁盘等步骤。 ### Java中解压ZIP文件的方法 ...

Global site tag (gtag.js) - Google Analytics