使用JAVA本身的ZIP API打包带有中文名称的文件(目录)会出现乱码,且winzip无法解压,如果要解决此问题,可以将
import java.util.zip.ZipOutputStream;
import java.util.zip.ZipEntry;
换为ant.jar中的API
/**
* 压缩文件(.zip)的函数
* @param zipDirectory:(需要)压缩的文件夹路径
* @param zipPath:文件压缩后放置的路径,该路径可以为null,null表示压缩到原文件的同级目录
* @return :返回一个压缩好的文件(File),否则返回null
*/
public File doZip(String zipDirectory, String zipPath) {
File zipDir = new File(zipDirectory);
if (zipPath == null) {
zipPath = zipDir.getParent();
}
// 压缩后生成的zip文件名
String zipFileName = zipPath + "/" + zipDir.getName() + ".zip";
try {
zipOut = new ZipOutputStream(new BufferedOutputStream(
new FileOutputStream(zipFileName)));
// 压缩文件
handleDir(zipDir, zipDir.getParent().length() + 1, zipOut);
zipOut.close();
return new File(zipFileName);
} catch (IOException e) {
logger.error(e);
e.printStackTrace();
return null;
}
}
/**
* 由doZip调用,递归完成目录文件读取
* @param dir:(需要)压缩的文件夹(File 类型)
* @param len:一个参数(记录压缩文件夹的parent路径的长度)
* @param zipOut:需要压缩进的压缩文件
* @throws IOException:如果出错,会抛出IOE异常
*/
private void handleDir(File dir, int len, ZipOutputStream zipOut)
throws IOException {
FileInputStream fileIn = null;
File[] files = dir.listFiles();
if (files != null) {
if (files.length > 0) { // 如果目录不为空,则分别处理目录和文件.
for (File fileName : files) {
if (fileName.isDirectory()) {
handleDir(fileName, len, zipOut);
} else {
fileIn = new FileInputStream(fileName);
zipOut.putNextEntry(new ZipEntry(fileName.getPath()
.substring(len).replaceAll("\\\\", "/")));
while ((readedBytes = fileIn.read(buf)) > 0) {
zipOut.write(buf, 0, readedBytes);
}
zipOut.closeEntry();
}
}
} else { // 如果目录为空,则单独创建之.
zipOut.putNextEntry(new ZipEntry(dir.getPath().substring(len)
+ "/"));
zipOut.closeEntry();
}
} else {// 如果是一个单独的文件
fileIn = new FileInputStream(dir);
zipOut.putNextEntry(new ZipEntry(dir.getPath().substring(len)));
while ((readedBytes = fileIn.read(buf)) > 0) {
zipOut.write(buf, 0, readedBytes);
}
zipOut.closeEntry();
}
}
/**
* 解压指定zip文件
* @param unZipfileName:需要解压的zip文件路径
* @param unZipPath:文件解压的路径,该路径可以为null,null表示解压到原文件的同级目录
*/
public boolean unZip(String unZipfileName, String unZipPath) {// unZipfileName需要解压的zip文件名
FileOutputStream fileOut = null;
InputStream inputStream = null;
File file = null;
if (unZipPath == null) {
unZipPath = new File(unZipfileName).getParent();
// System.out.println("1 -> " + unZipPath);
if (!(unZipPath.substring(unZipPath.length()).endsWith("/") || unZipPath
.substring(unZipPath.length()).endsWith("\\"))) {
unZipPath += "/";
}
} else {
unZipPath = new File(unZipPath).getPath() + "/";
}
try {
zipFile = new ZipFile(unZipfileName);
for (Enumeration<?> entries = zipFile.getEntries(); entries
.hasMoreElements();) {
ZipEntry entry = (ZipEntry) entries.nextElement();
int iTEMP = entry.getName().indexOf("/") + 1;
file = new File(unZipPath
+ entry.getName().substring(iTEMP,
entry.getName().length()));
if (entry.isDirectory()) {
file.mkdirs();
} else {
// 如果指定文件的目录不存在,则创建之.
File parent = file.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
inputStream = zipFile.getInputStream(entry);
fileOut = new FileOutputStream(file);
while ((this.readedBytes = inputStream.read(this.buf)) > 0) {
fileOut.write(this.buf, 0, this.readedBytes);
}
fileOut.close();
inputStream.close();
}
}
this.zipFile.close();
return true;
} catch (IOException ioe) {
logger.error(ioe);
ioe.printStackTrace();
return false;
}
}
分享到:
相关推荐
在Java编程环境中,打包文件或文件夹到zip压缩包是一项常见的任务,这通常涉及到I/O操作和文件处理。`ZIPUtil`可能是一个自定义的工具类,用于简化这个过程。以下是一些关于如何在Java中实现这个功能的关键知识点: ...
在Java编程中,向现有的ZIP压缩包追加文件通常需要经过解压、修改、再压缩的步骤,因为标准的Java ZIP库(如`java.util.zip`包)并不直接支持追加到已存在的ZIP文件。本篇文章将深入探讨如何实现这个功能,主要关注...
本篇文章将详细探讨如何使用Java内置的IO流来实现文件夹的zip压缩以及zip压缩包的解压,无需依赖其他的第三方库如Apache Commons IO或JavaZip。 ### 文件夹压缩成ZIP 首先,我们需要理解如何将一个文件夹及其内容...
"</td><td>" + rows[i].F_TX_NAME + "</td><td>" + rows[i].F_STUS + "</td><td>" + rows[i].F_DEV_ID + "</td><td>" + rows[i].F_SVR_CODE + "</td><td>" + rows[i].F_BRNO + "</td><td>" + rows[i].F_TIME + "</td...
在Java编程中,处理文件和压缩包操作是常见的任务,特别是在软件开发和数据传输中。本文将详细讲解如何使用Java实现将多目录多层级的文件打成ZIP包,以及如何解压这些ZIP包。我们将主要关注`FileUtils.java`这个类,...
1.将jacob-1.18.zip下载解压,在文件夹中找到jacob-1.18-x64.dll,jacob-1.18-x86.dll,jacob.jar 2.通过 pom.xml 新增 <dependency> <groupId>com.hynnet</groupId> <artifactId>jacob</artifactId> <version>...
例如xml文件的形式是<student><age>1</age><age2>2</age2></student>,在Java文件中设置demo路径,要替换的值,最后分别生成xml文件,例如要换成aa,则xml两个,一个为<student><age>aa</age><age>2</age></student>,...
总之,`ZipCompressor.java`是实现文件和文件夹压缩的关键类,它利用了Java标准库提供的`ZipOutputStream`和`ZipEntry`,通过一系列的步骤,将原始文件和目录打包成ZIP格式的压缩文件。熟悉这些概念和API,开发者就...
在Java编程语言中,`ZipUtil`文件压缩工具类是一个非常实用的工具,它利用了Java内置的`java.util.zip`包中的`ZipEntry`类来实现文件或目录的压缩功能。`ZipUtil`通常被设计为一个静态类,提供一系列静态方法,使得...
在Java编程语言中,压缩文件夹到指定目录和指定名称是一项常见的任务,这通常涉及到对文件系统的操作和使用压缩库。Java提供了多种方法来实现这一功能,比如使用内置的`java.util.zip`包或者第三方库如Apache ...
首先,我们需要了解Java中用于处理压缩文件的核心库——`java.util.zip`。 在Java中,我们可以使用`ZipOutputStream`类来创建ZIP压缩文件,以及`ZipFile`和`ZipInputStream`来读取和解压ZIP文件。`ZipOutputStream`...
在Java编程环境中,将多个Excel文件打包成ZIP文件并实现下载功能是一项常见的需求,尤其是在数据导出或批量处理场景中。下面将详细讲解这个过程涉及的主要知识点。 首先,我们需要了解Java中的`java.util.zip`包,...
java 实现指定目录下的文件打包zip格式 并指定存放zip包
* @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下 * void<br> */ public static void unzip(String zipFilePath, String targetPath) throws ...
QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库.适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后...<4> 调用Quazip压缩文件夹和解压zip文件的例子源码(完整的项目源码)
zip解压缩文件文件夹都可以,代码清晰,注释多。非常容易看懂
为了解决这一问题,我们可以利用Spring Boot结合Java编写一个简单的服务端逻辑,实现将多个文件打包成一个ZIP文件供用户一次性下载。这种方案不仅可以提高用户体验,还能有效减少网络传输次数,提升效率。 #### 二...
(压缩后为Zip文件) 无需导入任何个人jar包 压缩后效果等同于用winrar给压缩包加密码 时间紧迫,暂时存在中文文件夹名称乱码问题 不影响文件夹内各类型文件内容 实现方法见功能说明txt文档,只需传入文件夹路径...
### JAVA 从压缩包中提取文件 #### 一、项目简介 本项目旨在演示如何使用Java编程语言从ZIP格式的压缩文件中提取文件并显示其名称。ZIP是一种广泛使用的文件压缩与存档格式,常用于数据备份和网络传输中。在实际...
Java文件分割压缩是一种常见的...通过这些Java技术,我们可以创建一个能够处理大文件,根据用户需求进行拆分,并且能将拆分后的文件打包成ZIP格式的工具。这样的工具对于开发者来说非常实用,尤其是在处理大量数据时。