`

java解压缩中文不乱码 apache compress

阅读更多
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) {
                    // Create the the parent directory if it doesn't exist
                    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");
    }
}
分享到:
评论

相关推荐

    java android zip解压缩(解决压缩中文乱码问题)

    本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...

    文件解压和压缩 解决中文乱码

    在Java中,RAR格式的处理并不像ZIP那样内置在标准库中,通常需要第三方库如Apache Commons Compress或者JUnrar。对于ZIP压缩,可以使用`java.util.zip`包中的`ZipOutputStream`。对于RAR,使用JUnrar库,可以创建`...

    java zip文件压缩与解压缩

    Apache Commons Compress库是Java中一个强大的工具,它提供了对多种压缩格式的支持,包括zip,而且能够处理中文文件名的问题,避免了因为字符编码不正确导致的乱码问题。 首先,我们要了解Java内置的`java.util.zip...

    apache压缩解压zip,支持中文

    它可能被用来自动化编译、测试、打包等步骤,其中可能包括使用Apache Commons Compress进行压缩或解压缩。 - `ant-junit.jar`:这是Ant的JUnit任务的库,用于集成JUnit测试框架到构建流程中。 - `ant-launcher.jar`...

    安卓文件下载上传解压相关-javaandroidzip解压缩解决压缩中文乱码问题).rar

    在Android平台上,文件的下载、上传以及解压缩是常见的操作,尤其在处理用户数据或更新应用程序资源时。本文将深入探讨如何使用Java在Android环境中处理这些任务,特别是解决中文文件名在压缩和解压缩过程中可能出现...

    ZipUtil文件压缩工具类(解决中文乱码)

    此外,`ZipUtil`类可能还包含其他实用功能,比如解压缩ZIP文件,检查ZIP文件是否存在中文乱码,或者提供配置选项以自定义压缩级别、是否保留原文件的最后修改时间等。 总之,`ZipUtil`文件压缩工具类通过结合`Zip...

    java实现对文件或文件夹的压缩和解压缩

    总结一下,Apache Commons Compress库是Java中处理压缩和解压缩任务的理想选择,尤其是对于处理包含中文文件名的压缩文件。通过`ZipArchiveOutputStream`和`ZipArchiveInputStream`,我们可以方便地实现对文件或...

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

    二、Java解压缩文件 1. 使用`java.util.zip.GZIPInputStream`:解压GZIP格式的文件: ```java File inputFile = new File("压缩文件路径"); File outputFile = new File("解压后文件路径"); try ...

    java文件压缩与解压.doc

    Java中的文件压缩主要涉及使用第三方库Apache Commons Compress或者Apache的工具包`apache.tools.zip`来进行操作。这两种方式都允许开发者轻松地对文件进行压缩或解压缩。 #### 二、Apache Tools Zip 库简介 `...

    Java处理中文文件名-压缩中文名字的文件.rar

    Java标准库不直接支持RAR格式,但有第三方库如Apache Commons Compress可以帮助处理。对于ZIP格式,`java.util.zip`包提供了`ZipOutputStream`和`ZipInputStream`类,它们允许你创建和读取ZIP文件。处理中文文件名的...

    org.apache.tools.zip

    解压缩ZIP文件主要涉及`java.util.zip.ZipInputStream`和`org.apache.tools.zip.ZipEntry`。以下是一般过程: - 创建`ZipInputStream`对象,基于一个输入流(如FileInputStream),指向ZIP文件。 - 循环读取ZIP...

    知识收集2

    【描述】:虽然描述部分为空,但通过提供的博文链接可以推测,该主题可能涉及到一个实际的技术问题,即在使用Java进行文件压缩或解压缩时,可能会遇到文件名或内容出现乱码的情况。这通常是因为编码不一致导致的,...

    Java解压zip文件完整代码分享

    Apache Commons Compress库提供了方便的API来处理各种压缩格式,包括ZIP。以下是一个详细的Java解压ZIP文件的代码示例,我们将深入探讨这个过程。 首先,我们需要引入Apache Commons Compress库,可以通过Maven或...

    java解压zip或rar压缩文件源码与jar包

    综上所述,这个Java接口类解决了在解压ZIP和RAR文件时可能出现的乱码问题,通过自定义的解压方法,提供了稳定且兼容的解压缩功能。开发者可以方便地在自己的项目中集成这个接口,以便处理各种压缩文件。

    java压缩包解压

    本文将深入探讨如何在Java中实现解压缩功能,以及解决在处理包含中文文件名时可能出现的乱码问题。 首先,Java提供了`java.util.zip`包,它包含了处理ZIP文件的相关类。我们主要使用`ZipInputStream`和`ZipEntry`来...

    Java操作Ant压缩和解压文件及批量打包Anroid应用

    总结来说,使用Apache Ant库可以帮助Java开发者更轻松地处理中文路径和文件名的压缩解压缩问题,提供更友好的用户界面,同时简化了文件打包和解包的流程。在Android应用开发中,结合Ant进行文件操作能提高效率和质量...

    Unzip_demo.rar

    "Unzip_demo.rar"是一个示例项目,它演示了如何在Android应用中实现对ZIP文件的解压缩,特别是那些包含中文文件名的ZIP文件。以下是对这个主题的详细讲解: 首先,我们需要理解ZIP文件格式。ZIP是一种广泛使用的...

    如何基于java实现解压ZIP TAR等文件

    需要注意的是,当前的common-compress工具包不支持RAR格式的解压缩,需要使用junrar工具包来解压RAR文件。但是,junrar工具包有缺陷,例如,如果压缩文件中有中文名字的文件夹,解压以后文件夹名字是乱码。因此,在...

Global site tag (gtag.js) - Google Analytics