`
yuancihang
  • 浏览: 145170 次
  • 性别: 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");

分享到:
评论

相关推荐

    导入Excel文件所需要的JAR文件

    这个目录可能包含了多个JAR文件,这些文件可能是用来读取、写入或操作Excel文件的库。常见的有Apache POI、JExcelAPI、Aspose.Cells等。 2. **添加到项目类路径**:一旦你解压了JAR文件,你需要将它们添加到你的...

    文件操作及所需jar

    但如果在使用第三方库进行文件操作(如Apache Commons IO、Guava等),则需要将对应的JAR文件添加到项目类路径中。例如,Apache Commons IO库提供了许多方便的文件操作工具类,如`org.apache.commons.io.FileUtils`...

    java编程常用jar包

    JAR文件通常包含了一个或多个类路径、清单文件(MANIFEST.MF)、数字签名等元数据,有助于实现代码的模块化和优化。 在Java编程中,有许多常见的JAR包,它们提供了各种功能: 1. **Apache Commons**:Apache ...

    编译jar文件学习用

    在Java编程环境中,将项目打包成JAR(Java Archive)文件是常见的操作,这有助于代码的分发、存储和执行。"编译jar文件学习用"这个标题表明这是一个用于教学或自我学习如何创建JAR文件的示例。下面我们将详细讨论...

    jdbc(jar文件)

    **描述解析:** 描述提到"mysql, oracle和SQLser三大数据库与eclipse的桥梁",意味着这个jar文件包含了这三个主流数据库系统的JDBC驱动,使得开发者可以在Eclipse这样的集成开发环境中方便地进行数据库操作。...

    加密_jar文件_base64 Jar包

    在本案例中,"加密_jar文件_base64"指的是使用Base64编码对`jar`文件进行加密的过程,以增加其安全性,防止未经授权的访问和使用。 首先,我们需要理解Base64是什么。Base64是一种将二进制数据转换为可打印字符的...

    Java实现从jar包中读取指定文件的方法

    `JarFile`类是核心类,它允许我们打开并操作JAR文件。在给定的代码示例中,`JarFileAccess`类展示了如何读取JAR文件中的指定文件并将其复制到目标目录。 1. **创建`JarFile`对象**: 使用`new JarFile()`构造函数...

    可执行jar文件.以及执行命令

    在Java中,一个可执行JAR文件通常包含一个主类,这个主类包含了程序的入口点,即`main`方法。执行命令是启动可执行JAR的关键,通过指定正确的命令行参数,可以在不同的操作系统上运行这些程序。 Java的JAR文件实际...

    jar文件管理器 模拟文件管理

    【标题】"jar文件管理器 模拟文件管理"是一个基于Java编程语言开发的应用程序,主要目的是实现对文件和文件夹的基本操作。这个系统利用了Java的jar打包技术,将所有必要的类和资源打包成一个可执行的jar文件,使得...

    java 读取jar包文件

    `JarFile`是Java中用于操作jar文件的主要类。首先,你需要创建一个`JarFile`实例,传入jar文件的路径(如果jar文件在类路径中,可以使用类的全限定名)。一旦有了`JarFile`对象,你可以通过它的`entries()`方法获取...

    Java入门-生成可执行jar文件的教程

    本教程旨在引导初学者了解如何生成可执行的JAR文件,从而掌握Java的基础编程技能。对于初学者而言,掌握如何打包自己的Java程序为一个可执行的JAR文件是非常重要的一步,这不仅有助于程序的分发,还能提升程序的专业...

    JAR文件包及jar命令详解

    `jar`命令是Java开发工具的一部分,用于操作JAR文件。基本语法包括: - `cvf`:创建新的JAR文件,c表示创建,v表示详细模式,f表示指定文件名。 - `cmf`:更新已有JAR文件,添加或修改内容,m表示指定MANIFEST...

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

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

    jar文件查看工具

    **jar文件查看工具详解** 在Java开发环境中,`jar`文件是常见的二进制格式,用于打包类文件、资源文件以及元数据。`jar`文件的全称是Java Archive,它是Java平台的标准打包机制,类似于其他编程语言中的库或者DLL...

    java编程思想用到的可用文件 两个jar.zip

    在这个压缩包中,包含了两个重要的jar文件:net.mindview.util.jar和pets.jar,它们在学习和实践Java编程思想时可能会起到关键作用。 首先,我们来看`net.mindview.util.jar`。这个文件很可能包含了`MindView`公司...

    jar 包 内文件读取 文件内容

    在Java编程语言中,JAR...通过这些方法,开发者可以方便地访问和操作JAR文件内部的文件内容,无论是简单的文本文件还是其他类型的资源。在实际项目中,正确理解和利用这些技术对于有效管理和分发Java应用程序至关重要。

    jdbc驱动,三个jar文件

    在给定的标题和描述中提到的"jdbc驱动,三个jar文件",指的是为了实现JDBC功能,通常需要引入的三个核心的JAR(Java Archive)文件。这些JAR文件包含了必要的类和接口,使得Java程序能够连接到数据库,执行SQL语句,...

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

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

    standard.jar文件和 jstl.jar文件

    将这两个jar文件放在`/WEB-INF/lib/`目录下是遵循了Java Web应用的部署规范。在Java Web应用中,`/WEB-INF/lib/`目录是用来存放所有应用程序依赖的外部库文件的,这些库文件会被自动加入到类路径中,使得应用程序在...

    查看.jar文件工具

    "查看.jar文件工具"是为了帮助开发者和用户更便捷地探索.jar文件内部结构而设计的。这个工具能够让你无需解压就能查看其中的文件列表、读取类文件内容、检查资源文件等,对于理解程序的工作原理和调试问题非常有帮助...

Global site tag (gtag.js) - Google Analytics