package
main.util;
import
java.io.BufferedOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.InputStream;
import
java.io.IOException;
import
java.util.Enumeration;
import
org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import
org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import
org.apache.commons.compress.archivers.zip.ZipFile;
import
org.apache.commons.compress.utils.IOUtils;
/**
* Utility to Zip and Unzip nested directories recursively.
* @author Robin Spark
*/
public
class
ZipUtil {
/**
* Creates a zip file at the specified path with the contents of the specified directory.
* NB:
*
* @param directoryPath The path of the directory where the archive will be created. eg. c:/temp
* @param zipPath The full path of the archive to create. eg. c:/temp/archive.zip
* @throws IOException If anything goes wrong
*/
public
static
void
createZip(String directoryPath, String zipPath)
throws
IOException {
FileOutputStream fOut =
null
;
BufferedOutputStream bOut =
null
;
ZipArchiveOutputStream tOut =
null
;
try
{
fOut =
new
FileOutputStream(
new
File(zipPath));
bOut =
new
BufferedOutputStream(fOut);
tOut =
new
ZipArchiveOutputStream(bOut);
addFileToZip(tOut, directoryPath,
""
);
}
finally
{
tOut.finish();
tOut.close();
bOut.close();
fOut.close();
}
}
/**
* Creates a zip entry for the path specified with a name built from the base passed in and the file/directory
* name. If the path is a directory, a recursive call is made such that the full directory is added to the zip.
*
* @param zOut The zip file's output stream
* @param path The filesystem path of the file/directory being added
* @param base The base prefix to for the name of the zip file entry
*
* @throws IOException If anything goes wrong
*/
private
static
void
addFileToZip(ZipArchiveOutputStream zOut, String path, String base)
throws
IOException {
File f =
new
File(path);
String entryName = base + f.getName();
ZipArchiveEntry zipEntry =
new
ZipArchiveEntry(f, entryName);
zOut.putArchiveEntry(zipEntry);
if
(f.isFile()) {
FileInputStream fInputStream =
null
;
try
{
fInputStream =
new
FileInputStream(f);
IOUtils.copy(fInputStream, zOut);
zOut.closeArchiveEntry();
}
finally
{
IOUtils.closeQuietly(fInputStream);
}
}
else
{
zOut.closeArchiveEntry();
File[] children = f.listFiles();
if
(children !=
null
) {
for
(File child : children) {
addFileToZip(zOut, child.getAbsolutePath(), entryName +
"/"
);
}
}
}
}
/**
* Extract zip file at the specified destination path.
* NB:archive must consist of a single root folder containing everything else
*
* @param archivePath path to zip file
* @param destinationPath path to extract zip file to. Created if it doesn't exist.
*/
public
static
void
extractZip(String archivePath, String destinationPath) {
File archiveFile =
new
File(archivePath);
File unzipDestFolder =
null
;
try
{
unzipDestFolder =
new
File(destinationPath);
String[] zipRootFolder =
new
String[]{
null
};
unzipFolder(archiveFile, archiveFile.length(), unzipDestFolder, zipRootFolder);
}
catch
(Exception e) {
e.printStackTrace();
}
}
/**
* Unzips a zip file into the given destination directory.
*
* The archive file MUST have a unique "root" folder. This root folder is
* skipped when unarchiving.
*
* @return true if folder is unzipped correctly.
*/
@SuppressWarnings
(
"unchecked"
)
private
static
boolean
unzipFolder(File archiveFile,
long
compressedSize,
File zipDestinationFolder,
String[] outputZipRootFolder) {
ZipFile zipFile =
null
;
try
{
zipFile =
new
ZipFile(archiveFile);
byte
[] buf =
new
byte
[
65536
];
Enumeration entries = zipFile.getEntries();
while
(entries.hasMoreElements()) {
ZipArchiveEntry zipEntry = entries.nextElement();
String name = zipEntry.getName();
name = name.replace(
'\\'
,
'/'
);
int
i = name.indexOf(
'/'
);
if
(i >
0
) {
outputZipRootFolder[
0
] = name.substring(
0
, i);
}
name = name.substring(i +
1
);
}
File destinationFile =
new
File(zipDestinationFolder, name);
if
(name.endsWith(
"/"
)) {
if
(!destinationFile.isDirectory() && !destinationFile.mkdirs()) {
log(
"Error creating temp directory:"
+ destinationFile.getPath());
return
false
;
}
continue
;
}
else
if
(name.indexOf(
'/'
) != -
1
) {
File parentFolder = destinationFile.getParentFile();
if
(!parentFolder.isDirectory()) {
if
(!parentFolder.mkdirs()) {
log(
"Error creating temp directory:"
+ parentFolder.getPath());
return
false
;
}
}
}
FileOutputStream fos =
null
;
try
{
fos =
new
FileOutputStream(destinationFile);
int
n;
InputStream entryContent = zipFile.getInputStream(zipEntry);
while
((n = entryContent.read(buf)) != -
1
) {
if
(n >
0
) {
fos.write(buf,
0
, n);
}
}
}
finally
{
if
(fos !=
null
) {
fos.close();
}
}
}
return
true
;
}
catch
(IOException e) {
log(
"Unzip failed:"
+ e.getMessage());
}
finally
{
if
(zipFile !=
null
) {
try
{
zipFile.close();
}
catch
(IOException e) {
log(
"Error closing zip file"
);
}
}
}
return
false
;
}
private
static
void
log(String msg) {
System.out.println(msg);
}
/**
* Method for testing zipping and unzipping.
* @param args
*/
public
static
void
main(String[] args)
throws
IOException {
createZip(
"c:/temp/99/target"
,
"c:/temp/99/output2.zip"
);
extractZip(
"c:/temp/99/output2.zip"
,
"c:/temp/99/1"
);
}
}
相关推荐
本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...
在Java中,RAR格式的处理并不像ZIP那样内置在标准库中,通常需要第三方库如Apache Commons Compress或者JUnrar。对于ZIP压缩,可以使用`java.util.zip`包中的`ZipOutputStream`。对于RAR,使用JUnrar库,可以创建`...
Apache Commons Compress库是Java中一个强大的工具,它提供了对多种压缩格式的支持,包括zip,而且能够处理中文文件名的问题,避免了因为字符编码不正确导致的乱码问题。 首先,我们要了解Java内置的`java.util.zip...
它可能被用来自动化编译、测试、打包等步骤,其中可能包括使用Apache Commons Compress进行压缩或解压缩。 - `ant-junit.jar`:这是Ant的JUnit任务的库,用于集成JUnit测试框架到构建流程中。 - `ant-launcher.jar`...
在Android平台上,文件的下载、上传以及解压缩是常见的操作,尤其在处理用户数据或更新应用程序资源时。本文将深入探讨如何使用Java在Android环境中处理这些任务,特别是解决中文文件名在压缩和解压缩过程中可能出现...
此外,`ZipUtil`类可能还包含其他实用功能,比如解压缩ZIP文件,检查ZIP文件是否存在中文乱码,或者提供配置选项以自定义压缩级别、是否保留原文件的最后修改时间等。 总之,`ZipUtil`文件压缩工具类通过结合`Zip...
总结一下,Apache Commons Compress库是Java中处理压缩和解压缩任务的理想选择,尤其是对于处理包含中文文件名的压缩文件。通过`ZipArchiveOutputStream`和`ZipArchiveInputStream`,我们可以方便地实现对文件或...
二、Java解压缩文件 1. 使用`java.util.zip.GZIPInputStream`:解压GZIP格式的文件: ```java File inputFile = new File("压缩文件路径"); File outputFile = new File("解压后文件路径"); try ...
Java中的文件压缩主要涉及使用第三方库Apache Commons Compress或者Apache的工具包`apache.tools.zip`来进行操作。这两种方式都允许开发者轻松地对文件进行压缩或解压缩。 #### 二、Apache Tools Zip 库简介 `...
Java标准库不直接支持RAR格式,但有第三方库如Apache Commons Compress可以帮助处理。对于ZIP格式,`java.util.zip`包提供了`ZipOutputStream`和`ZipInputStream`类,它们允许你创建和读取ZIP文件。处理中文文件名的...
解压缩ZIP文件主要涉及`java.util.zip.ZipInputStream`和`org.apache.tools.zip.ZipEntry`。以下是一般过程: - 创建`ZipInputStream`对象,基于一个输入流(如FileInputStream),指向ZIP文件。 - 循环读取ZIP...
【描述】:虽然描述部分为空,但通过提供的博文链接可以推测,该主题可能涉及到一个实际的技术问题,即在使用Java进行文件压缩或解压缩时,可能会遇到文件名或内容出现乱码的情况。这通常是因为编码不一致导致的,...
Apache Commons Compress库提供了方便的API来处理各种压缩格式,包括ZIP。以下是一个详细的Java解压ZIP文件的代码示例,我们将深入探讨这个过程。 首先,我们需要引入Apache Commons Compress库,可以通过Maven或...
综上所述,这个Java接口类解决了在解压ZIP和RAR文件时可能出现的乱码问题,通过自定义的解压方法,提供了稳定且兼容的解压缩功能。开发者可以方便地在自己的项目中集成这个接口,以便处理各种压缩文件。
本文将深入探讨如何在Java中实现解压缩功能,以及解决在处理包含中文文件名时可能出现的乱码问题。 首先,Java提供了`java.util.zip`包,它包含了处理ZIP文件的相关类。我们主要使用`ZipInputStream`和`ZipEntry`来...
总结来说,使用Apache Ant库可以帮助Java开发者更轻松地处理中文路径和文件名的压缩解压缩问题,提供更友好的用户界面,同时简化了文件打包和解包的流程。在Android应用开发中,结合Ant进行文件操作能提高效率和质量...
"Unzip_demo.rar"是一个示例项目,它演示了如何在Android应用中实现对ZIP文件的解压缩,特别是那些包含中文文件名的ZIP文件。以下是对这个主题的详细讲解: 首先,我们需要理解ZIP文件格式。ZIP是一种广泛使用的...
需要注意的是,当前的common-compress工具包不支持RAR格式的解压缩,需要使用junrar工具包来解压RAR文件。但是,junrar工具包有缺陷,例如,如果压缩文件中有中文名字的文件夹,解压以后文件夹名字是乱码。因此,在...