`
yuancihang
  • 浏览: 142853 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

编程操作Jar文件

阅读更多

  支持把单个文件或者文件夹压缩成JAR文件, 支持把单个文件添加到已存在的JAR文件中, 支持读取JAR文件中的任何一个entry.

 

 

1. 环境

 

jdk1.6

 

2. 代码

 



import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;

import org.apache.log4j.Logger;

public class JarTool {
   
    private static final Integer BUFFER_SIZE = 512;
   
    /**
     * Logger for this class
     */
    private static final Logger logger = Logger.getLogger(JarTool.class);

   
    /**
     * 压缩文件夹及其子文件夹
     * @param source String 源文件夹,如: d:/tmp
     * @param dest String 目标文件,如: e:/tmp.jar
     * @throws IOException
     */
    public static void compressFolder(String source, String dest)throws IOException{
        JarOutputStream jos = new JarOutputStream(new FileOutputStream(dest));
        jos.setLevel(Deflater.BEST_COMPRESSION);
        compressJarFolder(jos, new File(source),"");
        jos.close();
    }
   
    private static void compressJarFolder(JarOutputStream jos, File f, String base)throws IOException{
        if(f.isFile()){
            compressJarFile(jos, f, base);
        }else if(f.isDirectory()){
            compressDirEntry(jos, f, base);
           
            String[] fileList = f.list();
            for(String file:fileList){
                String newSource = f.getAbsolutePath() + File.separator + file;
                File newFile = new File(newSource);
                String newBase = base + "/" + f.getName()+"/"+newFile.getName();
                if(base.equals("")){
                    newBase = newFile.getName();//f.getName()+"/"+newFile.getName();
                }else{
                    newBase = base + "/" + newFile.getName();
                }
               
                logger.info("正在压缩文件从 "+newSource+"    到 "+newBase);
                compressJarFolder(jos, newFile, newBase);
               
            }//for
           
        }//if
    }
   
    //压缩单个文件
    private static void compressJarFile(JarOutputStream jos, File f, String base)throws IOException{
        jos.putNextEntry(new ZipEntry(base));
       
        BufferedInputStream bin = new BufferedInputStream(new FileInputStream(f));
       
        byte[] data = new byte[JarTool.BUFFER_SIZE];
        while ((bin.read(data)) != -1) {
            jos.write(data);
        }
        bin.close();
        jos.closeEntry();
    }
   
    public static void compressFile(String sourceFile)throws IOException{
        String jarFile = sourceFile.substring(0, sourceFile.lastIndexOf('.')) + ".jar";
        compressFile(sourceFile, jarFile);
    }
   
    //压缩单个文件到JAR文件中
    public static void compressFile(String sourceFile, String jarFile)throws IOException{
        File f = new File(sourceFile);
        String base = f.getName();
        JarOutputStream jos = new JarOutputStream(new FileOutputStream(jarFile));
        jos.putNextEntry(new ZipEntry(base));
       
        BufferedInputStream bin = new BufferedInputStream(new FileInputStream(f));
       
        byte[] data = new byte[JarTool.BUFFER_SIZE];
        while ((bin.read(data)) != -1) {
            jos.write(data);
        }
        bin.close();
        jos.closeEntry();
        jos.close();
    }
   
    //压缩空文件夹
    private static void compressDirEntry(JarOutputStream jos, File f, String base)throws IOException{
        jos.putNextEntry(new ZipEntry(base + "/"));
       
        jos.closeEntry();
    }
   
    public static byte[] readEntry(String jarFile, String entryName)throws IOException{
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        boolean existEntry = readEntry(jarFile, entryName, baos);
        if(!existEntry){
            return null;
        }
        return baos.toByteArray();
    }
   
    public static boolean readEntry(String jarFile, String entryName, OutputStream os)throws IOException{
        JarFile jar = new JarFile(new File(jarFile));
        JarEntry entry = jar.getJarEntry(entryName);
        if(entry == null){
            return false;
        }
        InputStream is = new BufferedInputStream(jar.getInputStream(entry));
        int len = 0;
        byte[] b = new byte[1024];
        while ((len = is.read(b, 0, b.length)) != -1) {
            os.write(b, 0, len);
        }
        is.close();
        return true;
    }
   
    public static boolean existsEntry(String jarFile, String entryName)throws IOException{
        JarFile jar = new JarFile(new File(jarFile));
        JarEntry entry = jar.getJarEntry(entryName);
        if(entry == null){
            return false;
        }
        return true;
    }
   
    public static String readTextEntry(String jarFile, String entryName, String encoding)throws IOException{
        String entryContent = "";
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        boolean existEntry = readEntry(jarFile, entryName, baos);
        if(!existEntry){
            return null;
        }
        byte[] content = baos.toByteArray();
        baos.close();
        if(encoding == null){//按平台默认编码
            entryContent = new String(content);
        }else{
            entryContent = new String(content, encoding);
        }
        return entryContent;
    }
   
    public static String readTextEntry(String jarFile, String entryName)throws IOException{
        return readTextEntry(jarFile, entryName, null);
    }

 

    public static void uncompress(String jarFile)throws IOException{
        File f = new File(jarFile);
        String path = f.getAbsolutePath();
        int index = path.lastIndexOf(".");
        if(index > 0){
            path = path.substring(0, index);
        }
        uncompress(jarFile, path);
    }
    public static void uncompress(String jarFile, String outputDir)throws IOException{
        if(!new File(outputDir).exists()){
            new File(outputDir).mkdirs();
        }
        JarFile jar = new JarFile(new File(jarFile));
        Enumeration<JarEntry> e = jar.entries();
        while(e.hasMoreElements()){
            JarEntry entry = e.nextElement();
            saveEntry(jar, entry, outputDir);
        }

    }
    private static void saveEntry(JarFile jar, JarEntry entry, String outputDir)throws IOException{
        logger.info("解压缩" + entry.getName() + " ... ... ");
        File f = new File(new File(outputDir), entry.getName());
        if(entry.isDirectory()){
            f.mkdirs();
            return ;
        }else{
            f.createNewFile();
        }
        FileOutputStream fos = new FileOutputStream(f);
        InputStream is = new BufferedInputStream(jar.getInputStream(entry));
        int len = 0;
        byte[] b = new byte[1024];
        while ((len = is.read(b, 0, b.length)) != -1) {
            fos.write(b, 0, len);
        }
        is.close();
        fos.close();
    }

}

 

3. 测试代码

 

JarTool.compressFolder("d:\\test", "d:\\test.jar");
       JarUtil.jarFile("d:/key.txt");
        String text = readTextEntry("d:\\test.jar", "key.txt");
        System.out.println(text);

JarTool.uncompress("d:\\test\\test-0.1.0.jar");

分享到:
评论

相关推荐

    编程 - JSTL - jar文件 - 获取和使用指南 + 完整标题: 编程指南:获取和使用JSTL的jar文件

    本项目旨在向开发人员展示如何获取和使用JSTL的jar文件,并演示了如何在Java Web应用程序中有效地利用JSTL标签。 关键技术和内容关键词: JSTL(JavaServer Pages Standard Tag Library) Java Web开发 JSP页面 ...

    比较完善的文件操作jar文件

    自己写的比较完善的文件操作jar文件,实现了文件/文件夹的一些常用的操作,实现了文件的压缩解压,实现了部分字符串处理…… 资源分不够的朋友 欢迎进盟网〃编程交流中心(群):10939695群中提供下载及源码交流 更多...

    大数据实验5实验报告:MapReduce 初级编程实践

    (一)编程实现文件合并和去重操作 对于两个输入文件,即文件 A 和文件 B,请编写 MapReduce 程序,对两个文件进行合并, 并剔除其中重复的内容,得到一个新的输出文件 C。下面是输入文件和输出文件的一个样例 供...

    Java读写json文件需要引用的jar包

    java编程,对json文件进行读写操作,需要引用的jar包。

    spring jar包

    3.spring-beans:基础jar包,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring...

    jdom-1.1.3.jar包用于解析XML文件

    使用Jdom.jar包解析XML文件,JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合...

    Hadoop之MapReduce编程实例完整源码

    包含完整实例源码,编译配置文件,测试数据,可执行jar文件,执行脚本及操作步骤。学习完此例子后,你能掌握MapReduce基础编程,及如何编译Java文件,打包jar文件,编写shell执行脚本等。后续学习还可以参看本人的...

    spring4.3.9相关jar包

    spring-beans.jar(必须):这 个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI ...

    java操作Hadoop源码之HDFS Java API操作-上传文件

    java操作Hadoop源码之HDFS Java API操作-上传文件,附带所需全部jar包,欢迎下载学习。

    Java使用NFS实现上传、下载、读取文件工具类

    封装性:工具类封装了NFS相关的复杂连接、认证和I/O操作细节,使得业务层代码无需关心底层通信协议,只需通过简单API即可操作远程文件。 可配置性:允许灵活配置NFS服务器地址、挂载点以及其他相关参数,使工具类...

    Spring3+Hibernate4+Struts2 jar包 SSH框架

    spring 3.2.0+hibernate 4.1.6+struts2整合需要的jar包 的目录 ...文件上传,拦截器,操作的数据库是Mysql, 如果操作的数据库是oracle或者是其他, 将mysql-connector-java-5.1.20-bin.jar 改为相应的驱动包即可。

    java的jar包打包操作手册

    JAR(Java Archive,Java 归档文件),它将许多文件组合成一个压缩文件

    【批量下载】jetbrains-agent等_jetbrains-agent_jetbrains-agent.jar_Windo

    ycad操作dxf文件,jar包和测试用例子都有。(jlalkfhhahkllklkjajiaf)

    Android Volley Jar框架 v2017.3.17.zip

    Android Volley Jar,Android Volley框架是android开发中不可或缺的一个重要框架,想使用Android开发更加便捷的途径就是使用Volley框架了。 Android Volley Jar框架简介 ...Android Volley Jar文件预览

    JAVA + ACCESS 编程体会

     就编程来讲,对于sql server,微软提供了专门的jdbc驱动程序,也就是大家平常用的那三个jar文件。但access的编程可没那么豪华,现在可用的编程方法,只是提供一个jdbc-odbc桥接器进行连接,效率就不用说了哦。

    JAVA文件压缩与解压缩实践的实现.rar

    Java文件压缩与解压缩实践是指利用Java编程语言实现对文件或文件夹进行压缩和解压缩操作。以下是该实践的描述: 技术概述: Java文件压缩与解压缩是指将一个或多个文件或文件夹打包成一个压缩文件,或者将压缩文件...

    java与.NET混合编程

    实现java与.NET互操作,java调用.NET的动态链接库,C#调用java的jar文件

    斯坦福大学编程方法公开课与Karel机器人

    解压本下载文件,再将Karel机器人插件.zip解压,把文件夹中JAR放入你的eclipse 安装目录下的plugins 文件夹下,打开eclipise,之后能看比正常的Eclipse多出一个StanFord Menu的菜单,这就说明你Eclipse安装正确了。...

    tengge手机端j2me编程教程完整版

    ┃ 1_5.jar安装包文件的结构 ┃ 1_6.jad文件的结构 ┃ 1_7.j2me常用类库介绍 ┃第一章教程打包下载 ┗━━━━━━━━━━━ ┌第二章 高级用户界面设计 ┃2_1.信息提示Alert类 ┃2_2.文本界面程序设计 ┃2_3....

    JD-GUI-1.4.0

    要使用JD-GUI反编译JAR文件,请按照以下步骤操作: 下载并安装JD-GUI:访问JD-GUI官方网站(http://java-decompiler.github.io/),下载最新版本的JD-GUI。 打开JD-GUI:双击下载的JD-GUI启动程序,或者在命令行...

Global site tag (gtag.js) - Google Analytics