搞半天了,终于在网上找到了这个解决方法。
压缩代码
/**
* @param path
* 要压缩的路径, 可以是目录, 也可以是文件.
* @param basePath
* 如果path是目录,它一般为new File(path), 作用是:使输出的zip文件以此目录为根目录,
* 如果为null它只压缩文件, 不解压目录.
* @param zo
* 压缩输出流
* @param isRecursive
* 是否递归
* @param isOutBlankDir
* 是否输出空目录, 要使输出空目录为true,同时baseFile不为null.
* @throws IOException
*/
public static void zip(String path, File basePath, ZipOutputStream zo,
boolean isRecursive, boolean isOutBlankDir) throws IOException {
File inFile = new File(path);
File[] files = new File[0];
if (inFile.isDirectory()) { // 是目录
files = inFile.listFiles();
} else if (inFile.isFile()) { // 是文件
files = new File[1];
files[0] = inFile;
}
byte[] buf = new byte[1024];
int len;
// System.out.println("baseFile: "+baseFile.getPath());
for (int i = 0; i < files.length; i++) {
String pathName = "";
if (basePath != null) {
if (basePath.isDirectory()) {
pathName = files[i].getPath().substring(
basePath.getPath().length() + 1);
} else {// 文件
pathName = files[i].getPath().substring(
basePath.getParent().length() + 1);
}
} else {
pathName = files[i].getName();
}
if (files[i].isDirectory()) {
if (isOutBlankDir && basePath != null) {
zo.putNextEntry(new ZipEntry(pathName + "/")); // 可以使空目录也放进去
}
if (isRecursive) { // 递归
zip(files[i].getPath(), basePath, zo, isRecursive,
isOutBlankDir);
}
} else {
FileInputStream fin = new FileInputStream(files[i]);
zo.putNextEntry(new ZipEntry(pathName));
while ((len = fin.read(buf)) > 0) {
zo.write(buf, 0, len);
}
fin.close();
}
}
inFile = null;
files = null;
}
/**
*
* 压缩电子文件为ZIP包
*
* @param directory
* 需要压缩的目录
* @param zipFileName
* ZIP压缩文件完整路径名
* @return
*/
public static boolean expZip(String directory, String zipFileName) {
boolean bool = false;
try {
File file = new File(directory);
boolean validate = zipFileName.toLowerCase().endsWith(".zip");
if (!file.exists() || !validate || !file.isDirectory()) {
return false;
} else {
directory = directory.replace(File.separatorChar, '/');
zipFileName = zipFileName.replace(File.separatorChar, '/');
int x = zipFileName.lastIndexOf("/");
if (x <= -1) {
return false;
} else {
String zipdir = zipFileName.substring(0, x);
File zipdirs = new File(zipdir);
zipdirs.mkdirs();
zipdirs = null;
}
OutputStream os = new FileOutputStream(zipFileName);
BufferedOutputStream bs = new BufferedOutputStream(os);
ZipOutputStream zo = new ZipOutputStream(bs);
//[color=red]些句相当重要[/color]
zo.setEncoding(System.getProperty("sun.jnu.encoding"));
ZipOption.zip(directory, new File(directory), zo, true, true);
zo.closeEntry();
zo.close();
bs.close();
os.close();
File exit = new File(zipFileName);
bool = exit.exists();
exit = null;
}
file = null;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bool;
}
解压缩代码
/**
* 解压ZIP文件
*
* @param zipFileName
* String 为需要解压的zip文件
* @param extPlace
* String 为解压后文件的存放路径
*/
public static void extZipFileList(String zipFileName, String extPlace)
throws Exception {
// 验证ZIP压缩文件是否有效
File fileZip = new File(zipFileName);
boolean exists = fileZip.exists();// 判断文件/文件夹是否存在
if (exists) {
// 创建extPlace目录
File dirs = new File(extPlace);
dirs.mkdirs();
dirs = null;
// 请空目录
ZipFile zipFile = null;
try {
//[color=red]些句相当重要[/color]
System.setProperty("sun.zip.encoding",System.getProperty("sun.jnu.encoding"));
zipFile = new ZipFile(zipFileName);
FileInputStream zin = new FileInputStream(zipFileName);
ZipInputStream zis = new ZipInputStream(zin);
//这里必需用jdk自带的ZipEntry
java.util.zip.ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
String entryName = zipEntry.getName().replace(
File.separatorChar, '/');
String names[] = entryName.split("/");
int length = names.length;
String path = extPlace;
for (int v = 0; v < length; v++) {
if (v < length - 1) {
path += names[v] + "/";
new File(path).mkdir();
} else { // 最后一个
if (entryName.endsWith("/")) { // 为目录,则创建文件夹
new File(extPlace + entryName).mkdir();
} else {
FileOutputStream fos = new FileOutputStream(
extPlace + entryName);
int len;
byte[] buffer = new byte[1024];
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
}
}
}
zis.closeEntry();
zipEntry = zis.getNextEntry();
}
} catch (Exception e) {
e.printStackTrace();
if (zipFile != null)
zipFile.close();
}
if (zipFile != null)
zipFile.close();
} else {
}
fileZip = null;
}
分享到:
相关推荐
### Java中压缩与解压——中文文件名乱码解决办法 #### 一、问题背景及原理分析 在Java中处理文件的压缩与解压时,经常会遇到中文文件名出现乱码的问题。这个问题主要源于Java中默认使用的编码方式与实际文件名...
Java文件下载文件名乱码问题解决方案 Java 文件下载文件名乱码问题是指在下载 Java 文件时,文件名出现乱码现象,影响下载文件的正确性。这种问题通常有两种情况:一是下载时中文文件名乱码,二是下载时因为路径中...
在Java编程中,遇到“java下载时文件名乱码”的问题通常是由于编码不一致或处理不当造成的。在处理文件下载时,尤其是从Web服务器下载带有非ASCII字符的文件名时,这种问题尤为常见。让我们深入探讨这个问题,并提供...
本文将详细介绍如何使用Java实现文件下载功能,并重点讲解如何解决中文文件名乱码的问题。 #### 一、基本原理与步骤 1. **读取文件**:首先需要将要下载的文件读取到内存中。 2. **设置响应头**:为了正确地告知...
jsch-0.1.53 不支持修改编码格式,sftp.setFilenameEncoding("GBK");这样修改是不起作用的,所以必须修改源码。此处是修改源码后重新导出的jar包。
在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...
总之,解决JSmartCom的中文文件名乱码问题,不仅需要深入理解JavaScript和HTTP的字符编码机制,还需要对JSmartCom的源码有充分的认识,以便定位和修改关键代码。通过以上所述的步骤和方法,你应该能够成功地克服这个...
通过上述步骤,可以实现基于Java向ZIP压缩包追加文件的功能,虽然这个过程涉及解压和再压缩,但它是最常见的解决方案,因为Java的标准库不直接支持追加操作。在实际应用中,可以根据具体需求进行优化和调整,以满足...
`ZipUtil`是一个专门用于文件压缩的工具类,它解决了在处理包含中文字符的文件或目录时可能出现的乱码问题。`ZipEntry`是Java标准库`java.util.zip`包中的核心类,用于表示ZIP文件中的一个条目,它可以是文件或目录...
总的来说,使用Java的`ZipOutputStream`进行文件压缩时,必须注意文件名和路径的正确编码,以避免乱码问题。通过使用合适的编码方式(如UTF-8)并在`ZipOutputStream`构造函数中明确指定,可以确保在跨平台操作时...
以下是一些解决HttpClient中文乱码问题的关键知识点: 1. **设置字符编码**:在发送HTTP请求时,我们需要确保请求头中的`Content-Type`字段指定了正确的字符集,如`application/x-www-form-urlencoded; charset=UTF...
Apache Ftp Server是一个广泛使用的开源FTP服务器,但在处理中文目录和文件名时可能会出现乱码问题,这主要是由于字符编码不兼容导致的。本篇文章将详细探讨这个问题以及如何通过GBK字符集来解决。 首先,FTP(File...
1. **字符编码基础**:理解字符编码是解决问题的第一步。常见的字符集有GBK、GB2312(简体中文)、Big5(繁体中文)以及Unicode家族的UTF-8、UTF-16等。UTF-8是一种变长编码,可以兼容全世界几乎所有的字符,因此在...
总之,这个“java 上传、下载 组建”提供了全面的文件上传解决方案,特别是对于中文文件名乱码的处理,使得开发者可以更专注于业务逻辑,而无需担忧底层的编码问题。通过深入理解并使用这个源码,可以提高Java Web...
在Android平台上进行文件解压操作时,可能会遇到文件名或文件内容出现乱码的问题。这主要是由于编码格式不兼容导致的。以下是一些关键知识点,帮助开发者理解和解决Android解压过程中的乱码问题: 1. **编码理解**...
本文将深入探讨如何在Java中实现解压缩功能,以及解决在处理包含中文文件名时可能出现的乱码问题。 首先,Java提供了`java.util.zip`包,它包含了处理ZIP文件的相关类。我们主要使用`ZipInputStream`和`ZipEntry`来...
如果遇到中文文件名显示乱码的问题,你可能需要尝试调整字符编码设置或者使用其他支持Unicode的压缩库。 总的来说,处理带密码的RAR文件在Java中可以通过第三方库实现,这些库通常会提供API来设置密码和处理解压缩...
标题中的“java .net php .js 乱码转换器”是一个工具,旨在解决跨平台、跨语言编码不兼容导致的乱码问题。这个工具支持Java、.NET(C#、VB.NET等)、PHP以及JavaScript这四种广泛使用的编程语言,帮助开发者在处理...
总的来说,`AesZipFileEncrypter` 是一个针对Java环境的实用工具,它利用AES加密技术为ZIP文件提供了安全保障,同时解决了中文文件名乱码问题,确保了文件在加密过程中的完整性和可读性。在处理包含中文字符的文件时...
本资源提供了一种解决方案,解决了使用Java打zip包时可能会遇到的中文乱码和包含空文件的问题。以下是关于这个主题的一些关键知识点: 1. **Java的 ZIP API**:Java标准库提供了一个名为`java.util.zip`的包,它...