zoukankan      html  css  js  c++  java
  • java对zip压缩文件解压缩

    关键字: 解压缩zip文件

         偶尔一次,遇到这样一个问题,要求对zip文件进行解压缩,并读取压缩包中.txt和.inf文件的数据,经过jdk Helper 和 Google才将问题得以解决。这里只写了解压过程,在main方法中压缩包存放路径和解压到目标的文件已经硬编码进去了。程序整体结构不是很令人满意,仍然需要重构.......

    package com.da.unzip;

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.Reader;
    import java.nio.ByteBuffer;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;

    public class Unzip {

     public static void main(String[] args) throws Exception {

      Unzip unzip = new Unzip();
      String zippath = "C:\\unzip\\";// /解压到的目标文件路径
      String zipDir = "C:\\data\\";// 要解压的压缩文件的存放路径
      
       File file = new File(zipDir);
       List list = unzip.getSubFiles(file);
       for (Object obj : list) {
       String realname = ((File)obj).getName();
       System.out.println(realname);
       int end = realname.lastIndexOf(".");
       System.out.println("要解压缩的文件名.........."+zipDir+realname);
       System.out.println("解压到的目录" +zippath+realname.substring(0, end));
       unzip.testReadZip(zippath,zipDir+realname);
       }  

     }

     /*
      * 解压缩功能. 将zippath目录文件解压到unzipPath目录下. @throws Exception
      */
     public void ReadZip(String zippath, String unzipPath) throws Exception {

      ZipFile zfile = new ZipFile(unzipPath);// 生成一个zip文件对象

      System.out.println(zfile.getName());// 获取要解压的zip的文件名全路径

      Enumeration zList = zfile.entries();// 返回枚举对象

      ZipEntry ze = null;// 用于表示 ZIP 文件条目

      byte[] buf = new byte[1024];// 声明字节数组
      /**
       * 循环获取zip文件中的每一个文件
       */
      while (zList.hasMoreElements()) {
       // 从ZipFile中得到一个ZipEntry
       ze = (ZipEntry) zList.nextElement();
       if (ze.isDirectory())// 如果为目录条目,则返回 true,执行下列语句
       {
        System.out.println("Dir: " + ze.getName() + " skipped..");
        continue;
       }
       int begin = zfile.getName().lastIndexOf("\\") + 1;
       int end = zfile.getName().lastIndexOf(".");
       String zipRealName = zfile.getName().substring(begin, end);
       System.out.println("解压缩开始Extracting:"+ze.getName()+"\t"+ze.getSize()+"\t"+ze.getCompressedSize());
       // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中,并加上缓冲
       OutputStream os = new BufferedOutputStream(
         new FileOutputStream(getRealFileName(zippath + "\\"
           + zipRealName, ze.getName())));
       InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
       String fileName = getRealFileName(zippath, ze.getName()).getName();
       System.out.println("解压出的文件名称:" + fileName);
       int readLen = 0;
       while ((readLen = is.read(buf, 0, 1024)) != -1) {
        os.write(buf, 0, readLen);
       }
       is.close();
       os.close();
       // System.out.println("解压缩结束Extracted: "+ze.getName());
      }
      zfile.close();
     }

     /**
      * 给定根目录,返回一个相对路径所对应的实际文件名.
      *
      * @param zippath
      *            指定根目录
      * @param absFileName
      *            相对路径名,来自于ZipEntry中的name
      * @return java.io.File 实际的文件
      */
     private File getRealFileName(String zippath, String absFileName) {

      String[] dirs = absFileName.split("/", absFileName.length());

      File ret = new File(zippath);// 创建文件对象

      if (dirs.length > 1) {
       for (int i = 0; i < dirs.length - 1; i++) {
        ret = new File(ret, dirs[i]);

       }
      }

      if (!ret.exists()) {// 检测文件是否存在
       ret.mkdirs();// 创建此抽象路径名指定的目录
      }
      ret = new File(ret, dirs[dirs.length - 1]);// 根据 ret 抽象路径名和 child
                 // 路径名字符串创建一个新 File 实例

      return ret;
     }
     
    }

  • 相关阅读:
    软件项目管理
    asterisk channel driver dev ref
    标 题: 有什么办法快速把pc上的网址发送到手机上
    dongle0
    ubuntu
    Huawei E1750 Asterisk
    Jquery重新学习之七[Ajax运用总结A]
    Jquery重新学习之六[操作XML数据]
    Jquery重新学习之五[操作JSON数据]
    Jquery重新学习之四[核心属性与文档处理属性]
  • 原文地址:https://www.cnblogs.com/chen1987lei/p/1867667.html
Copyright © 2011-2022 走看看