`
hao84099
  • 浏览: 28226 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

java实现可自己添加文件或文件夹的压缩(转)

阅读更多
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.Vector;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
 

/**
 * 压缩文件类,支持添加文件或文件夹
 * @author Teddy
 *
 */
public class ZipUtil {
 
 /*存放添加的文件集合*/
 private static Vector files = new Vector();
 /*存放所有文件的集合*/
 private static Vector all_files = new Vector();

 
 /**
  * 功能:
     * @param args
     */
    public static void main(String[] args) {
     long a = System.currentTimeMillis();
     System.out.println("开始压缩文件");
     ZipUtil zip = new ZipUtil();
     File f1 = new File("g:\\zip_test\\sogou_pinyin_52c.exe");
     zip.addFile(f1);
     zip.addFile(new File("g:\\xiahps\\主题\\note.Gadget"));
     File ff [] = zip.getListFiles();    
     zip.zipFiles(ff, new File("g:\\abc.zip"), "g:\\");   
     zip.clear();
     long b = System.currentTimeMillis()-a;
     System.out.println("压缩完毕!耗时:"+(double)b/1000+"秒");
     System.out.println("开始解压文件");
     zip.unZipFiles("g:\\abc.zip","g:\\zzw");
     long c = System.currentTimeMillis()-a;
     System.out.println("解压完毕!总耗时:"+(double)c/1000+"秒");
    }

    
    public ZipUtil(){}
    /**
     * 添加待压缩的文件(支持添加文件夹)
     * @param f
     */
    public static void addFile(File f){
     if(f==null||!f.exists())return;
     if(!files.contains(f)) files.addElement(f);
    }
    
    /**
     * 获取文件列表
     * @return
     */
    public static File [] getListFiles(){
     File list_files [] = null;
     if(files==null||files.size()==0)return null;
     for(int i=0;i<files.size();i++){
      File f = (File)files.get(i);
      refreshFileList(f.getAbsolutePath());
     }
     list_files = new File[all_files.size()];
     for(int i=0;i<all_files.size();i++){      
      list_files[i] = (File)all_files.elementAt(i);
     }
     return list_files;
    }
    
 /**
  * 装载一个目录或文件
  * @param strPath
  */
 public static void refreshFileList(String strPath) { 
  File dir = new File(strPath); 
  //是文件直接装载
  if(dir!=null&&dir.isFile()){all_files.add(dir);return;}
  File[] ff = dir.listFiles(); 
  if (ff == null) 
   return; 
  for (int i = 0; i < ff.length; i++) { 
   if (ff[i].isDirectory()) { 
    refreshFileList(ff[i].getAbsolutePath()); 
   } else { 
    String strFileName = ff[i].getAbsolutePath().toLowerCase();  
    if(!all_files.contains(strFileName))
     all_files.add(ff[i]);
   }
  } 
 }

 
 /**
  * 不替换路径的压缩
  * @param srcfile
  * @param zipfile
  */
 public static void zipFiles(File[] srcfile,File zipfile){
  zipFiles(srcfile,zipfile,null);
 }
 
    /**
     * 功能:压缩多个文件或文件夹成一个zip文件
     * @param srcfile:源文件列表
     * @param zipfile:压缩后的文件
     * @param repstr:绝对路径替换
     */
    public static void zipFiles(File[] srcfile,File zipfile,String repstr){
        byte[] buf=new byte[1024];
        try {
            ZipOutputStream out=new ZipOutputStream(new FileOutputStream(zipfile));
            out.setEncoding("GBK");//解决中文问题
            for(int i=0;i<srcfile.length;i++){
             if(srcfile[i].isDirectory())zipFiles(srcfile[i].listFiles(),zipfile,repstr);//是文件夹,递归继续压缩
                FileInputStream in=new FileInputStream(srcfile[i]);         
                if(repstr==null||repstr.equals(""))
                 out.putNextEntry(new ZipEntry(srcfile[i].getAbsolutePath()));
                else
                 out.putNextEntry(new ZipEntry(com.jspsoft.util.StringEx.replace(srcfile[i].getAbsolutePath(), repstr, "")));//处理压缩文件带路径的情况,使用srcfile[i].getAbsolutePath()
                //System.out.println("正在压缩 "+srcfile[i].getAbsolutePath());
                int len;
                //out.write(enstr.getBytes());
                while((len=in.read(buf))>0){
                    out.write(buf,0,len);
                }
                out.closeEntry();
                in.close();
            }
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    
    /**
     * 默认不带解压路径就解压到当前文件夹
     * @param source
     */
    public static void unZipFiles(String source){
     unZipFiles(source,null);
    }
  /**
   * 解压文件
  * @param source:压缩文件
  * @param destination:解压地址
  */
 public static void unZipFiles(String source, String destination){
   try {
   if(destination==null||destination.equals(""))
    destination = new File(source).getParent();
      int buffer=1024;
      ZipFile zipFile = new ZipFile(source);
      Enumeration emu = zipFile.getEntries();
      while (emu.hasMoreElements()) {
     ZipEntry entry = (ZipEntry) emu.nextElement();
     if(destination!=null&&destination.lastIndexOf("\\")!=destination.length()-1)
      destination+="\\";//增强容错性
     //System.out.println("正在解压 "+destination+entry.getName());
     //目录不存在创建目录
     if (entry.isDirectory()) {
       new File(destination + entry.getName()).mkdirs();
       continue;
     }
     BufferedInputStream bis = new BufferedInputStream(zipFile
       .getInputStream(entry));
     File file = new File(destination + entry.getName());
     //文件所在目录如果不存在则创建
     File parent = file.getParentFile();
     if (parent != null && (!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) {e.printStackTrace();}
 }

           
    /**
     * 释放资源
     */
    public static void clear(){
     if(all_files!=null&&all_files.size()>0)all_files.removeAllElements();
     if(files!=null&&files.size()>0)files.removeAllElements();
    }
    public static Vector getFiles() {
  return files;
 }

 public static void setFiles(Vector files) {
  ZipUtil.files = files;
 } 

}
分享到:
评论

相关推荐

    JAVA实现对文件夹“加密码压缩”

    JAVA实现对文件夹“加密码压缩” 此资源解压后为一个文件夹,就是一个package包 (压缩后为Zip文件) 无需导入任何个人jar包 压缩后效果等同于用winrar给压缩包加密码 时间紧迫,暂时存在中文文件夹名称乱码问题...

    Java实现将多目录多层级文件打成ZIP包,以及解压ZIP包

    包含了使用的jar包,以及一个Java类,实现了使用Java对多目录多层级的文件进行打包,以及对ZIP包进行解压缩的操作。

    Java毕业设计-JAVA文件压缩与解压缩实践(源代码+论文).rar

    2. 文件压缩:可批量选择文件或文件夹进行压缩,并自定义压缩级别和压缩文件名。 3. 文件解压缩:支持解压到指定目录,自动识别和处理压缩包内嵌套的子目录结构。 4. 用户界面友好:提供图形化操作界面,简化用户...

    java源码包---java 源码 大量 实例

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    JAVA上百实例源码以及开源项目

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    java源码包4

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    java源码包3

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    java源码包2

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    java解压缩工具程序

    本代码是一个简单的解压缩工具,其可以实现将文件压缩成压缩文件,也可解压缩(此功能与压缩类似,本人并没有...其中实现了JList的添加图标的selection还实现了将文件夹中的所有文件压缩的递归算法。请尝试。谢谢支持。

    JAVA上百实例源码以及开源项目源代码

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看 Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看 Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码...

    Java 添加文本框到 PPT 幻灯片.docx

    方法一: 下载Free Spire.Presentation for Java包并解压缩,然后将lib文件夹下的jar包作为依赖项直接导入到Java应用程序中。 方法二: 通过Maven仓库安装jar包,配置pom.xml文件的代码如下:

    java工具类:文件操作工具类.java

    * @param inputFileName 要压缩的文件或文件夹路径,例如:c:\\a.txt,c:\\a\ * @param outputFileName 输出zip文件的路径,例如:c:\\a.zip */ public static void zip(String inputFileName, String ...

    Java 在 PDF 中添加表单域.docx

    PDF表单域是指用户在PDF文件中可以自主进行填写、选择等操作的区域,其主要目的是采集用户...方法一: 下载Free Spire.PDF for Java包并解压缩,然后将lib文件夹下的Spire.Pdf.jar包作为依赖项导入到Java应用程序中

    基于zip4j的压缩工具

    基于zip4j的压缩工具, 支持多文件合并压缩,目录树压缩,支持编码设置,支持密码保护

    安卓反向编译.APK文件

    一、用压缩软件打开apk,得到五个文件或文件夹 1、META-INF 2、res 3、AndroidManifest.xml 4、classes.dex 5、resources.arsc 二、xml文件是被压缩过的,可以使用AXMLPrinter2打开 三、resources.arsc保存的...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

Global site tag (gtag.js) - Google Analytics