精华内容
下载资源
问答
  • java zip解压

    2021-06-05 15:46:07
    前言:zip解压Windows默认是GBK,Mac默认是UTF-8,为了保证都可以解压,就需要根据不同 的文件设置不同的编码格式,本文解决方案是根据是否乱码来判断(详见下文)

    前言:zip解压Windows默认是GBK,Mac默认是UTF-8,为了保证都可以解压,就需要根据不同               的文件设置不同的编码格式,本文解决方案是根据是否乱码来判断(详见下文)

               如果解压过程中不需要操作文件请看方法一(三行解压到本地),如果解压过程中需要操               作文件如网盘中实现在线解压,基本实现设想就是边解压,边创建文件夹(或上传文件)               到网盘数据库

                注:两种方法均引用与其他博客,但由于找不到原文地址了,忘有知道的兄弟留言告知,                     及时加注上

    方法一:

    maven配置:

            <dependency>
                <groupId>net.lingala.zip4j</groupId>
                <artifactId>zip4j</artifactId>
                <version>1.3.2</version>
            </dependency>

    代码:

    package com.gxs.test.util;
    
    
    import net.lingala.zip4j.core.ZipFile;
    import net.lingala.zip4j.model.FileHeader;
    import java.util.List;
    
    /**
     * 已解决乱码问题
     */
    public class UnZipFiles {
    
        public static void unZip(String zipPath, String destDir) throws Exception {
            ZipFile zipFile = new ZipFile(zipPath);
            zipFile.setFileNameCharset(getEncoding(zipPath));
            zipFile.extractAll(destDir);
        }
    
        @SuppressWarnings("unchecked")
        private static String getEncoding(String path) throws Exception {
            String encoding = "GBK";
            ZipFile zipFile = new ZipFile(path);
            zipFile.setFileNameCharset(encoding);
            List<FileHeader> list = zipFile.getFileHeaders();
            for (int i = 0; i < list.size(); i++) {
                FileHeader fileHeader = list.get(i);
                String fileName = fileHeader.getFileName();
                if (isMessyCode(fileName)) {
                    encoding = "UTF-8";
                    break;
                }
            }
            return encoding;
        }
    
        private static boolean isMessyCode(String str) {
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                // 当从Unicode编码向某个字符集转换时,如果在该字符集中没有对应的编码,则得到0x3f(即问号字符?)
                // 从其他字符集向Unicode编码转换时,如果这个二进制数在该字符集中没有标识任何的字符,则得到的结果是0xfffd
                if ((int) c == 0xfffd) {
                    // 存在乱码
                    return true;
                }
            }
            return false;
        }
    
    
    
        public static void main(String[] args){
            /**
             * 解压文件
             */
            String zipFile = "E:\\ziptest\\测试1级目录.zip";
            String path = "E:\\ziptest";
            try {
                unZip(zipFile, path);
            } catch (Exception e) {
                e.printStackTrace();
            }
            ;
    
        }
    }
    
    
    

     

    方法二:

    代码:

    package com.gxs.test.util;
    
    import org.springframework.stereotype.Component;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.nio.charset.Charset;
    import java.util.zip.CRC32;
    import java.util.zip.CheckedInputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    
    /**
     * zip压缩工具类
     *  @className: UnzipUtils
     *  @author: gxs
     *  @date: 2021/6/5 9:13
     *  @version: 1.0
     */
    @Component
    public class UnzipUtil {
    
        private static final int BUFFER = 1024;
        private static final String CODING_UTF8 = "UTF-8";
        private static final String CODING_GBK = "GBK";
    
        /**
         * 解压入口方法
         *
         * @param zipPath zip文件物理地址
         * @param unzipPath 解压后存放路径
         * @throws Exception
         */
        public static void decompress(String zipPath, String unzipPath)  throws Exception {
            //解压缩执行方法
            decompressFile(new File(zipPath), new File(unzipPath));
        }
    
        /**
         * 解压缩执行方法
         *
         * @param srcFile 压缩文件File实体
         * @param destFile 解压路径File实体
         * @throws Exception
         */
        public static void decompressFile(File srcFile, File destFile) throws Exception {
            //创建数据输入流
            CheckedInputStream cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32());
            //创建压缩输入流
            ZipInputStream zis = new ZipInputStream(cis, Charset.forName(CODING_UTF8));
            //异常捕获的方式判断编码格式
            try {
                //判断代码,如果此代码未抛出异常,则表示编码为UTF-8
                zis.getNextEntry().getName();
            } catch (Exception e) {
                //如果乱码会抛异常,抛异常重新创建输入流,重新设置编码格式
                cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32());
                zis = new ZipInputStream(cis, Charset.forName(CODING_GBK));
            }
            //解压zip
            decompressZis(destFile, zis);
            //关闭流
            zis.close();
    
        }
    
        /**
         * 文件 解压缩执行方法
         *
         * @param destFile 目标文件
         * @param zis ZipInputStream
         * @throws Exception
         */
        private static void decompressZis(File destFile, ZipInputStream zis)   throws Exception {
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                //获取当前的ZIP条目路径
                String dir = destFile.getPath() + File.separator + entry.getName();
                File dirFile = new File(dir);
                //递归检查文件路径,路径上没有文件夹则创建,保证整条路径在本地存在
                fileProber(dirFile);
                //判断是否是文件夹
                if (entry.isDirectory()) {
                    //如果是,创建文件夹
                    dirFile.mkdirs();
                    System.out.println(dirFile.getName());
                } else {
                    //如果不是文件夹,数据流输出,生成文件
                    decompressFile(dirFile, zis);
                }
                //关闭当前的ZIP条目并定位流
                zis.closeEntry();
            }
        }
    
        /**
         * 文件探针,当父目录不存在时,创建目录
         * 
         * @param dirFile ZIP条目路径
         */
        private static void fileProber(File dirFile) {
            //获取此路径的父目录
            File parentFile = dirFile.getParentFile();
            //判断是否存在
            if (!parentFile.exists()) {
                // 递归寻找上级目录
                fileProber(parentFile);
                //直至存在,递归执行创建文件夹
                parentFile.mkdir();
            }
    
        }
    
        /**
         * 生成文件
         * 
         * @param destFile 目标文件
         * @param zis ZipInputStream
         * @throws Exception
         */
        private static void decompressFile(File destFile, ZipInputStream zis) throws Exception {
            //创建输出流
            BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(destFile));
            //转成byte数组
            int count;
            byte[] data = new byte[BUFFER];
            //读取并写入文件
            while ((count = zis.read(data, 0, BUFFER)) != -1) {
                bos.write(data, 0, count);
            }
            //关闭数据流
            bos.close();
        }
    
        public static void main(String[] args){
            try {
                decompress("E:\\ziptest\\测试1级目录.zip", "E:\\ziptest\\");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

     

    展开全文
  • Android Java zip解压

    2018-02-11 11:44:40
    Android Java zip 解压库,全部源代码,代码很精简,可以取到每个文件在压缩文件中的起始位置及大小信息。
  • java Zip解压

    2012-01-13 09:52:58
    给位大大好,现在小弟在JavaZip解压上有个问题,请给为大侠帮下忙。 现在有个需求要把上传的文件打成Zip包后,把Zip包以BLOB的数据形式存在数据库中,然后在下载的时候在把BLOB的数据 换成Zip包,在解压这个Zip...
  • Java zip解压,并遍历zip中的配置文件 .cfg或.properties,项目实用
  • 网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void ...将E:\\aaaa\\中文.zip解压到E:\\aaaa\\中文目录下
  • 最近在在使用zip 解压时,使用JDK1.7及以上版本在解压时,某些文件会报异常 Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED at java.util.zip.ZipCoder.toString(ZipCoder.java:58) ...

    最近在在使用zip 解压时,使用JDK1.7及以上版本在解压时,某些文件会报异常

    Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED
        at java.util.zip.ZipCoder.toString(ZipCoder.java:58)
        at java.util.zip.ZipFile.getZipEntry(ZipFile.java:567)
        at java.util.zip.ZipFile.access$900(ZipFile.java:61)
        at java.util.zip.ZipFile$ZipEntryIterator.next(ZipFile.java:525)
        at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:500)
        at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:481)
        at zip.ReadingArchive.unzip(ReadingArchive.java:36)
        at zip.ReadingArchive.unzip(ReadingArchive.java:82)
        at zip.ReadingArchive.unzip(ReadingArchive.java:82)
        at main.Main.main(Main.java:13)

    究其原因是因为文件名中文所致,而ZIPFile默认使用UTF-8,在遇到解压非UTF-8的时候就会报错
    public ZipFile(File file, int mode) throws IOException {
    this(file, mode, StandardCharsets.UTF_8);
    }

    最终我用的解决方法为
    Charset gbk = Charset.forName("GBK");
    ZipFile zipFile = new ZipFile(zipFileName, gbk);

    当然这个肯定不适用与所有环境,可以使用的修改字符集来解决,仅供参考。

    转载于:https://www.cnblogs.com/TimBing/p/4459788.html

    展开全文
  • Java zip解压工具类

    千次阅读 2019-03-13 17:48:55
    分享一个自己用的zip工具类 public class ZipUtils { public static void unZip(File srcFile, String destDirPath) throws RuntimeException { long start = System.currentTimeMillis(); // 判断...

    分享一个自己用的zip工具类

    public class ZipUtils {
    	 public static void unZip(File srcFile, String destDirPath) throws RuntimeException {
    		 
    		         long start = System.currentTimeMillis();
    		         // 判断源文件是否存在
    		         if (!srcFile.exists()) {
    		             throw new RuntimeException(srcFile.getPath() + "所指文件不存在");
    		         }
    		         // 开始解压
    		         ZipFile zipFile = null;
    		         try {
    		             zipFile = new ZipFile(srcFile);
    		             Enumeration<?> entries = zipFile.entries();
    		             while (entries.hasMoreElements()) {
    		                 ZipEntry entry = (ZipEntry) entries.nextElement();
    		                 System.out.println("解压" + entry.getName());
    		                 // 如果是文件夹,就创建个文件夹
    		                 if (entry.isDirectory()) {
    		                     String dirPath = destDirPath + "/" + entry.getName();
    		                     File dir = new File(dirPath);
    		                     dir.mkdirs();
    		                 } else {
    		                     // 如果是文件,就先创建一个文件,然后用io流把内容copy过去
    		                     File targetFile = new File(destDirPath + "/" + entry.getName());
    		                     // 保证这个文件的父文件夹必须要存在
    		                     if(!targetFile.getParentFile().exists()){
    		                         targetFile.getParentFile().mkdirs();
    		                     }
    		                     targetFile.createNewFile();
    		                     // 将压缩文件内容写入到这个文件中
    		                     InputStream is = zipFile.getInputStream(entry);
    		                     FileOutputStream fos = new FileOutputStream(targetFile);
    		                    int len;
    		                     byte[] buf = new byte[1024];
    		                     while ((len = is.read(buf)) != -1) {
    		                         fos.write(buf, 0, len);
    		                     }
    		                     // 关流顺序,先打开的后关闭
    		                     fos.close();
    		                     is.close();
    		                 }
    		             }
    		             long end = System.currentTimeMillis();
    		             System.out.println("解压完成,耗时:" + (end - start) +" ms");
    		         } catch (Exception e) {
    		             throw new RuntimeException("unzip error from ZipUtils", e);
    		         } finally {
    		             if(zipFile != null){
    		                 try {
    		                     zipFile.close();
    		                 } catch (IOException e) {
    		                     e.printStackTrace();
    		                 }
    		             }
    		         }
    		     }
    	 public static void main(String args[]) {
    		 File zip = new File("F:/data.zip");
    	    	File outputDir = new File("F:/");
    	    	unZip(zip,"F:/datecopy");
    	 }
    }
    

     

    展开全文
  • java zip解压算法

    2013-05-17 09:24:20
    public static void unCategoryZip(String filePath){ ... String fileName=filePath+"category.zip"; ZipFile zipFile = new ZipFile(new File(fileName)); Enumeration emu = zipFile.entries();
    public static void unCategoryZip(String filePath){
    		try {
    			String fileName=filePath+"category.zip";
    			ZipFile zipFile = new ZipFile(new File(fileName));
    			
    			Enumeration emu = zipFile.entries();
    			int BUFFER = 2048;
    			while(emu.hasMoreElements()){
    				ZipEntry entry = (ZipEntry) emu.nextElement();
    				if(entry.isDirectory()){
    					new File(filePath+entry.getName()).mkdirs();
    					continue;
    				}
    				String[] categoryName = entry.getName().split("/");
    				if(!categoryName[1].equals("categoryCsv")){
    					continue;
    				}
    				BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));
    				System.out.println(entry.getName());
    				File file = new File(filePath+categoryName[0]+".txt");
    				File parent=file.getParentFile();
    				if(null!=parent&!parent.exists()){
    					parent.mkdirs();
    				}
    				FileOutputStream fos = new FileOutputStream(file);
    				
    				BufferedOutputStream bos = new BufferedOutputStream(fos,BUFFER);
    				
    				int count;
    				byte data[] = new byte[BUFFER];
    				
    				while((count=bis.read(data,0,BUFFER))!=-1){
    					bos.write(data,0,count);
    				}
    				bos.flush();
    				bos.close();
    				bis.close();
    			}
    			zipFile.close();
    		} catch (Exception e) {
    			logger.error("" + e.getMessage(), e);
    		}
    	}

    展开全文
  • 四处收集的代码 运行效率: 方法一 &amp;amp;gt; 方法二 测试数据不大只有100M,方法一至少被方法二快3~4倍 /** * 解压实现 * ... * @param basePath 解压文件存放的父路径 */ private s...
  • java压缩解压ZIP

    2017-03-23 16:33:32
    java压缩解压ZIP
  • java zip 压缩解压例子

    2012-01-30 11:53:29
    java zip 压缩解压例子
  • java rar和zip解压

    2013-08-28 16:32:23
    java rar解压 zip解压 工具
  • java zip压缩解压 工具类 java zip压缩解压 工具类
  • javazip压缩包 解压缩包Eclipse项目20111011 javazip压缩包 解压缩包Eclipse项目20111011javazip压缩包 解压缩包Eclipse项目20111011
  • java使用Zip解压

    2019-07-07 16:23:20
    1.使用unzip这个方法...(1)zipFileName要是文件的路径,例如文件名为test.zip,存放在F盘的mywork文件夹下,那么这里的zipFileName要为F:\\mywork\test.zip (2)如果压缩文件夹的内部有多个文件,但是in.getNex...
  • Java解压ZIP

    2019-12-24 14:50:23
    Java解压ZIP package test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; ...
  • 废话不多说,直接上代码吧一、代码 /** * zip解压 * @param srcFile zip源文件 * @param destDirPath 解压后的目标文件夹 * @throws RuntimeException 解压失败会抛出运行时异常 */ public static void unZip....
  • java Zip压缩解压

    2013-11-22 16:32:15
    zip包里面有两个文件,一个是zip封装类,一个是测试类, 还有这个里面需要用到apache的ant.jar包,和junit.jar单元测试包,如果报错请导入上面说的两个包
  • Java ZIP(二) - zip解压

    2017-10-16 23:58:03
    1. 概述2. 实例import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;...import java.util....import java.util.zip.Z
  • java解压zip

    千次阅读 2018-07-17 11:20:40
    java(kotlin)解压zip
  • Java压缩解压ZIP文件

    2021-03-16 06:19:54
    Java压缩解压ZIP文件,将利用java.util.zip 包中提供的类来实现压缩和解压zip 格式文件的功能。当然,本例在功能上完全没有Winzip 等成熟的压缩软件那么强,也不能做的很强,本例仅仅是演示如何来使用java.util....
  • java解压zip文件

    万次阅读 2020-09-03 10:57:01
    import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import java.io.*; import java.util.Enumeration;... * 解压zip文件 * @author xiyue * @param sourceFile,待解压的zi
  • java zip压缩解压

    千次阅读 2012-07-12 12:22:55
    使用java自带的zip包压缩、解压文件/文件夹。显示进度。在windows XP SP3 + jdk1.7下测试不存在中文路径乱码问题。 import java.io.*; import java.util.zip.*; public class Zip { int filesCount;//总数量...
  • javazip解压

    2016-02-22 10:25:09
    package com.han; import java.io.*; import java.util.zip.*; public class CopyOfMyzipDecompressing { public static void main(String[] args) { // TODO Auto-generated method stub long startT
  • Java Zip文件解压

    2011-04-11 17:34:30
    写完了流的解压,想到文件的解压,也写一个例子吧!   接下来的故事:   ...import java.io.IOException;...import java.io.InputStream;...import java.util.zip.ZipEntry; import java.util.zip.ZipFile;...
  • java zip文件解压

    2018-04-18 21:12:38
    public static void unZipFiles(String zipStr, String descDir) throws IOException { //zipStr为压缩源文件,descDir为目标文件夹  File zipFile = new File... ZipFile zip = new ZipFile(zipFile,Charset.fo...
  • java zip 压缩与解压

    2017-04-18 14:15:00
    java zip 压缩与解压 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,377
精华内容 2,950
关键字:

javazip解压

java 订阅