`

java解压压缩包终极篇(解决中文乱码)

    博客分类:
  • JAVA
阅读更多

    文件操作其实不难,但是在项目中是很常用的,这里分享个解压压缩包的终结代码:zip格式的需要用java.util.zip包,rar格式的需要用com.github.junrar。

    话不多说,代码如下:

 

 

/**
      * 解压zip格式的压缩文件到指定位置
      *
      * @param zipFileName
      *            压缩文件 全路径
      * @param dstDirectoryPath
      *            解压目录
      * @throws Exception
      */
     public static boolean unZipFile(String zipFileName, String dstDirectoryPath)
                throws Exception {
           // 乱码问题以及文件内容重复问题
           System.setProperty("sun.zip.encoding",
                     System.getProperty("sun.jnu.encoding"));
           try {
                File dstDiretory = new File(dstDirectoryPath);
                if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹
                     dstDiretory.mkdirs();
                }
                File f = new File(zipFileName);
                if ((!f.exists()) && (f.length() <= 0)) {
                     throw new Exception("要解压的文件不存在!");
                }
                ZipFile zipFile = new ZipFile(zipFileName, Charset.forName("gbk")); // 处理中文文件名乱码的问题
                String strPath, gbkPath, strtemp;
                File tempFile = new File(dstDirectoryPath);
                strPath = tempFile.getAbsolutePath();
                Enumeration<?> e = zipFile.entries();
                while (e.hasMoreElements()) {
                     ZipEntry zipEnt = (ZipEntry) e.nextElement();
                     gbkPath = zipEnt.getName();
                     // 判断是目录还是文件 如果是文件直接解析和上传
                     // 如果是目录 创建文件夹 递归去处理文件
                     if (zipEnt.isDirectory()) {
                           strtemp = strPath + File.separator + gbkPath;
                           File dir = new File(strtemp);
                           dir.mkdirs();
                           continue;
                     } else {
                           // 读写文件
                           InputStream is = zipFile.getInputStream(zipEnt);
                           BufferedInputStream bis = new BufferedInputStream(is);
                           gbkPath = zipEnt.getName();
                           strtemp = strPath + File.separator + gbkPath;

                           // 建目录 直接处理怕出现重名 覆盖
                           String strsubdir = gbkPath;
                           for (int i = 0; i < strsubdir.length(); i++) {
                                if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {
                                     String temp = strPath + File.separator
                                                + strsubdir.substring(0, i);
                                     File subdir = new File(temp);
                                     if (!subdir.exists())
                                           subdir.mkdir();
                                }
                           }
                           FileOutputStream fos = new FileOutputStream(strtemp);
                           BufferedOutputStream bos = new BufferedOutputStream(fos);
                           int c;
                           while ((c = bis.read()) != -1) {
                                bos.write((byte) c);
                           }
                           bos.close();
                           fos.close();

                     }
                }

                return true;
           } catch (Exception e) {
                e.printStackTrace();
                return false;
           }
     }

     /**
      * 根据原始rar路径,解压到指定文件夹下.
      *
      * @param srcRarPath
      *            原始rar路径
      * @param dstDirectoryPath
      *            解压到的文件夹
      */
     public static boolean unRarFile(String srcRarPath, String dstDirectoryPath) {
           File dstDiretory = new File(dstDirectoryPath);
           if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹
                dstDiretory.mkdirs();
           }
           Archive a = null;
           File rarFile = null;
           try {
                rarFile = new File(srcRarPath);
                if (!rarFile.exists()) {
                     return false;
                } else {
                     a = new Archive(rarFile);
                     if (a != null) {
                           // a.getMainHeader().print(); // 打印文件信息.
                           FileHeader fh = a.nextFileHeader();
                           while (fh != null) {
                                // 防止文件名中文乱码问题的处理

                                String fileName = fh.getFileNameW().isEmpty() ? fh
                                           .getFileNameString() : fh.getFileNameW();
                                if (fh.isDirectory()) { // 文件夹
                                     File fol = new File(dstDirectoryPath
                                                + File.separator + fileName);
                                     fol.mkdirs();
                                } else { // 文件
                                     File out = new File(dstDirectoryPath
                                                + File.separator + fileName.trim());
                                     try {
                                           if (!out.exists()) {
                                                if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录.
                                                     out.getParentFile().mkdirs();
                                                }
                                                out.createNewFile();
                                           }
                                           FileOutputStream os = new FileOutputStream(out);
                                           a.extractFile(fh, os);
                                           os.close();
                                     } catch (Exception ex) {
                                           ex.printStackTrace();
                                     }
                                }
                                fh = a.nextFileHeader();
                           }
                           a.close();
                     }
                }
                return true;
           } catch (Exception e) {
                e.printStackTrace();
           }

           return false;
     }


 /**
      * 删除文件目录及文件
      *
      * @param delFile
      */
     private void deleteFile(File delFile) {

           // 删除单个文件
           if (delFile.exists()) {
                if (delFile.isFile()) {
                     delFile.delete();
                } else if (delFile.isDirectory()) {
                     // 如果是目录 遍历目录下的文件 删除文件后删除目录
                     File[] files = delFile.listFiles();
                     for (int i = 0; i < files.length; i++) {
                           deleteFile(files[i]);
                     }
                     delFile.delete();// 删除掉目录
                }
           }
     }

     /**
      * 删除本地目录及文件
      *
      * @param sPath
      *            绝对路径
      */
     private void deleteFolder(String sPath) {

           File file = new File(sPath);
           // 判断目录或文件是否存在
           if (!file.exists()) { // 不存在返回 false
                return;
           } else {
                // 判断是否为文件
                deleteFile(file);
           }

     }
 

 

分享到:
评论

相关推荐

    java zip压缩解压工具解决中文乱码问题

    以上代码片段展示了如何利用Apache Commons IO库来处理中文乱码问题,使得在Java中进行ZIP文件的压缩和解压更加便捷和准确。在实际开发中,根据项目需求,可以选择使用标准库或者Apache Commons IO库,确保文件名和...

    [Java]PDF转图片解决中文乱码.zip

    在这个特定的压缩包文件中,"PDF2img"是一个基于PDFBox开发的DEMO,它设计用于解决PDF转图片时可能出现的中文乱码问题。 PDFBox是Apache软件基金会的一个开源项目,提供了丰富的API来读取、写入、修改PDF文档。在...

    解决java压缩zip文件时的中文乱码问题(包含jar包和工具类)

    解决java压缩zip文件时的中文乱码问题 实现:java压缩文件成zip实现无乱码。 包括:写好的工具类与jar包。 使用方法:导入ant.jar包,调用CompressExcelOperate中的方法,即可实现压缩文件,并保证没有中文乱码...

    Java 11 压缩包版 -jdk11.0.12

    这个"Java 11 压缩包版 - jdk11.0.12"包含了Java Development Kit的最新稳定版本,允许开发者在Windows操作系统上搭建Java开发环境。下面将详细介绍如何安装、配置以及使用Java 11,同时也会涉及一些相关的重要知识...

    Java提取压缩包中的文件.rar

    Java提取压缩包中的文件,文件操作的范畴,操作对象为ZIP格式的压缩文件,将从ZIP中提取出BMP图像文件,要将从压缩包中提取文件,必须先解压压缩包,然后将指定文件拷贝出来,代码中先实现了对zip文件的解压,然后...

    Java中递归逻辑循环调用解压zip里面所有的压缩包

    Java中递归逻辑循环调用解压zip里面所有的压缩包 Java中递归逻辑循环调用解压zip里面所有的压缩包

    java zip压缩包 解压zip Eclipse项目

    java 打zip压缩包 解压缩包Eclipse项目20111011 java 打zip压缩包 解压缩包Eclipse项目20111011java 打zip压缩包 解压缩包Eclipse项目20111011

    基于Java向zip压缩包追加文件

    通过上述步骤,可以实现基于Java向ZIP压缩包追加文件的功能,虽然这个过程涉及解压和再压缩,但它是最常见的解决方案,因为Java的标准库不直接支持追加操作。在实际应用中,可以根据具体需求进行优化和调整,以满足...

    Java 解压带密码的 RAR文件

    Java解压RAR文件,压缩包内包含源码、Jar包、依赖包和示例程序,也可以从http://code.google.com/p/java-unrar/downloads/list这里下载支持密码的unrar项目(包括源码和jar包),其依赖包也很容易搜到。 RAR 密码

    使用Java向服务器上传文件压缩包并实现解压缩

    在这个场景中,我们关注的是如何使用Java来实现文件压缩包的上传以及在服务器上的解压缩。Java作为一种强大的编程语言,提供了丰富的库来支持这样的操作,特别是在涉及到SFTP(Secure File Transfer Protocol)时,...

    《MLDN出品JAVA风暴JAVA学习的终极资料》JAVASE压缩包

    《MLDN出品JAVA风暴JAVA学习的终极资料》JAVASE压缩包是一份全面且深入的Java SE(标准版)学习资源集合。这份压缩包显然旨在为Java初学者和进阶者提供一个完整的知识体系,帮助他们在Java编程领域扎实基础,提升...

    Android 解压,解决乱码问题

    以下是一些关键知识点,帮助开发者理解和解决Android解压过程中的乱码问题: 1. **编码理解**:在计算机系统中,文本通常由特定的字符编码表示,如ASCII、UTF-8、GBK等。不同编码方式对应不同的字符集,如果处理...

    解决中文Windows系统下解压日语名文件乱码的小工具

    在日本经常使用zip或者lha格式的压缩包,在中文系统下解压时,如果压缩包里的文件是日语名,虽然能正常解压,但是解出的文件会变成乱码。这实际上是日语系统使用Shift-JIS编码,在中文系统下解压时按照GB编码显示...

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

    总之,`ZipUtil`文件压缩工具类通过结合`ZipEntry`和`ZipOutputStream`,提供了一种高效且健壮的解决方案,尤其适合处理包含中文字符的文件和目录,确保在压缩和解压过程中不会出现乱码问题。这对于需要在Java应用...

    解压文件时中文乱码

    以下是关于解决“解压文件时中文乱码”问题的相关知识点: 1. **编码概念**:编码是将字符转换为二进制数据的过程,以便计算机存储和处理。常见的字符编码标准有ASCII、GBK、GB2312、Big5和Unicode(包括其变体UTF-...

    Linux 中unzip解压时中文乱码的解决办法

    在Linux环境中,当我们尝试使用`unzip`命令解压包含中文文件名的压缩包时,经常会出现中文乱码的问题。这是因为`unzip`程序在处理非ASCII字符时,可能会使用其内部默认的编码方式,而这个编码方式并不支持中文字符集...

    JAVA_1.8.0压缩包

    这个压缩包简化了Java开发环境的安装过程,用户可以直接下载并解压,然后在系统环境变量中进行配置,以确保系统能够找到Java的执行路径。这对于初学者和专业开发者来说都是一个方便的步骤,避免了在线安装过程中可能...

    java加密解密zip压缩包

    在Java编程环境中,创建一个能够加密和解密ZIP压缩包的项目是一项常见的需求,尤其是在处理敏感数据时。本文将深入探讨如何使用Java实现这一功能,同时也会提及与ActionScript 3(AS3)进行加密解密的相关知识。 ...

    Java maven压缩包

    Java Maven压缩包是一个包含了Apache Maven 3.8.4版本的软件包,Maven是Java开发中的一个项目管理和综合工具。它主要负责构建、依赖管理和项目信息管理,极大地简化了Java项目的构建过程。Maven使用一种标准的项目...

Global site tag (gtag.js) - Google Analytics