Java实现Jar文件的遍历复制与文件追加

 更新时间:2024年11月30日 15:15:08   作者:爱码少年 00fly.online  
这篇文章主要为大家详细介绍了如何利用Java实现Jar文件的遍历复制与文件追加功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、引入依赖

		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.5</version>
		</dependency>
		<!-- slf4j + log4j2 begin -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-slf4j-impl</artifactId>
			<version>2.12.1</version>
		</dependency>
		<!-- log4j end -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.12</version>
			<scope>provided</scope>
		</dependency> 
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-compress</artifactId>
			<version>1.23.0</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

二、文件准备

三、Java编码实现

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.SystemUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.junit.Test;

import lombok.extern.slf4j.Slf4j;

/**
 * @author 00fly
 *
 */
@Slf4j
public class JarEntryTest
{
    /**
     * JDK-API实现-将addFiles添加到srcJar并重命名为newJar
     * 
     * @param srcJar
     * @param newJar
     * @param addFiles
     * @throws IOException
     */
    private void addFilesToJar(File srcJar, String newJar, File... addFiles)
        throws IOException
    {
        try (JarInputStream jis = new JarInputStream(new FileInputStream(srcJar)); JarOutputStream jos = new JarOutputStream(new FileOutputStream(newJar), jis.getManifest()))
        {
            JarEntry jarEntry;
            while ((jarEntry = jis.getNextJarEntry()) != null)
            {
                jos.putNextEntry(jarEntry);
                IOUtils.copy(jis, jos);
            }
            
            // 追加文件
            for (File addFile : addFiles)
            {
                jarEntry = new JarEntry("add/" + addFile.getName());
                jos.putNextEntry(jarEntry);
                try (InputStream entryInputStream = new FileInputStream(addFile))
                {
                    IOUtils.copy(entryInputStream, jos);
                }
            }
        }
    }
    
    /**
     * 拷贝 Jar
     * 
     * @param fromJar
     * @param toJar
     * @throws IOException
     */
    private void copyJar(String fromJar, String toJar)
        throws IOException
    {
        try (JarInputStream jis = new JarInputStream(new BufferedInputStream(new FileInputStream(fromJar))); JarOutputStream jos = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(toJar)), jis.getManifest()))
        {
            JarEntry je;
            while ((je = jis.getNextJarEntry()) != null)
            {
                jos.putNextEntry(je);
                int iRead;
                while ((iRead = jis.read()) != -1)
                {
                    jos.write(iRead);
                }
            }
            jis.closeEntry();
            jos.finish();
        }
    }
    
    @Test
    public void testAddFiles()
    {
        try
        {
            String src = getClass().getResource("/apache-jstl.jar").getPath();
            String add1 = getClass().getResource("/servlet-api.jar").getPath();
            String add2 = getClass().getResource("/log4j2.xml").getPath();
            String newJar = src.replace(".jar", DateFormatUtils.format(System.currentTimeMillis(), "_HHmmssSSS") + ".jar");
            log.info("源文件: {}", src);
            log.info("++新增: {}", add1);
            log.info("++新增: {}", add2);
            log.info("新文件: {}", newJar);
            addFilesToJar(new File(src), newJar, new File(add1), new File(add2));
        }
        catch (IOException e)
        {
            log.error(e.getMessage(), e);
        }
    }
    
    @Test
    public void testCopy()
    {
        try
        {
            String src = getClass().getResource("/servlet-api.jar").getPath();
            String newJar = src.replace(".jar", DateFormatUtils.format(System.currentTimeMillis(), "_HHmmssSSS") + ".jar");
            log.info("源文件: {}", src);
            log.info("新文件: {}", newJar);
            copyJar(src, newJar);
            
            if (SystemUtils.IS_OS_WINDOWS)
            {
                Runtime.getRuntime().exec("cmd /c start " + new File(newJar).getParentFile().getCanonicalPath());
            }
        }
        catch (IOException e)
        {
            log.error(e.getMessage(), e);
        }
    }
    
    /**
     * 遍历打印
     * 
     * @throws IOException
     */
    @Test
    public void testList()
        throws IOException
    {
        String src = getClass().getResource("/servlet-api.jar").getPath();
        try (JarInputStream jis = new JarInputStream(new BufferedInputStream(new FileInputStream(src))))
        {
            JarEntry je;
            while ((je = jis.getNextJarEntry()) != null)
            {
                System.out.println(je.getName());
            }
            jis.closeEntry();
        }
    }
}

四、Compress编码实现

Compress 功能非常强大,可以参考官网样例:

https://commons.apache.org/proper/commons-compress/examples.html

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.compress.archivers.jar.JarArchiveEntry;
import org.apache.commons.compress.archivers.jar.JarArchiveInputStream;
import org.apache.commons.compress.archivers.jar.JarArchiveOutputStream;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.junit.Test;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class CompressTest
{
    @Test
    public void test()
        throws IOException
    {
        String src = getClass().getResource("/apache-jstl.jar").getPath();
        String add1 = getClass().getResource("/servlet-api.jar").getPath();
        String add2 = getClass().getResource("/log4j2.xml").getPath();
        String newJar = src.replace(".jar", DateFormatUtils.format(System.currentTimeMillis(), "_HHmmssSSS") + ".jar");
        log.info("源文件: {}", src);
        log.info("++新增: {}", add1);
        log.info("++新增: {}", add2);
        log.info("新文件: {}", newJar);
        
        try (JarArchiveInputStream jarInput = new JarArchiveInputStream(new FileInputStream(src)); ArchiveOutputStream outputStream = new JarArchiveOutputStream(new FileOutputStream(newJar)))
        {
            JarArchiveEntry jarEntry;
            while ((jarEntry = jarInput.getNextJarEntry()) != null)
            {
                outputStream.putArchiveEntry(jarEntry);
                IOUtils.copy(jarInput, outputStream);
            }
            outputStream.flush();
            
            // 追加addFiles
            String[] addFiles = {add1, add2};
            for (String addFile : addFiles)
            {
                JarArchiveEntry addEntry = new JarArchiveEntry("add/" + StringUtils.substringAfterLast(addFile, "/"));
                outputStream.putArchiveEntry(addEntry);
                try (InputStream entryInputStream = new FileInputStream(addFile))
                {
                    IOUtils.copy(entryInputStream, outputStream);
                }
            }
            
            // 追加add/001.txt
            JarArchiveEntry entry = new JarArchiveEntry("add/001.txt");
            outputStream.putArchiveEntry(entry);
            outputStream.write("org.apache.commons.compress.archivers.jar.JarArchiveOutputStream;".getBytes(StandardCharsets.UTF_8));
            outputStream.closeArchiveEntry();
            outputStream.finish();
        }
    }
}

到此这篇关于Java实现Jar文件的遍历复制与文件追加的文章就介绍到这了,更多相关Java Jar文件操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java代理模式实例详解【静态代理与动态代理】

    Java代理模式实例详解【静态代理与动态代理】

    这篇文章主要介绍了Java代理模式,结合实例形式详细分析了java静态代理与动态代理模式相关概念、原理、操作技巧与注意事项,需要的朋友可以参考下
    2019-09-09
  • SpringBoot整合SSE接口实现实时数据推送

    SpringBoot整合SSE接口实现实时数据推送

    SSEServer-Sent Events)是一种基于HTTP的服务器向客户端单向实时推送数据的技术,本文主要介绍了SpringBoot整合SSE接口实现实时数据推送的方法,需要的可以参考下
    2025-05-05
  • SpringBoot集成netty实现websocket通信功能

    SpringBoot集成netty实现websocket通信功能

    Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端,WebSocket 是一种网络通信协议,相比传统的HTTP协议,本文给大家介绍了SpringBoot集成netty实现websocket通信功能,需要的朋友可以参考下
    2024-03-03
  • Java编程—在测试中考虑多态

    Java编程—在测试中考虑多态

    这篇文章主要介绍了Java编程—在测试中考虑多态,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot入门之集成JSP的示例代码

    SpringBoot入门之集成JSP的示例代码

    这篇文章主要介绍了SpringBoot入门之集成JSP的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 一文秒懂 kafka HA(高可用)

    一文秒懂 kafka HA(高可用)

    这篇文章主要介绍了秒懂 kafka HA(高可用)的相关知识,本文我们来说一说和 kafka 高可用相关的一些策略,对kafka HA相关知识感兴趣的朋友一起看看吧
    2021-11-11
  • JAVA实现红包分发的示例代码

    JAVA实现红包分发的示例代码

    这篇文章主要介绍了JAVA实现红包分发的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 如何解决Spring事务注解@Transactional在类内部方法调用不生效

    如何解决Spring事务注解@Transactional在类内部方法调用不生效

    这篇文章主要介绍了如何解决Spring事务注解@Transactional在类内部方法调用不生效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java数据结构之KMP算法的实现

    Java数据结构之KMP算法的实现

    这篇文章主要为大家详细介绍了Java数据结构中KMP算法的原理与实现,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-11-11
  • JAVA调用JavaScript方法代码示例

    JAVA调用JavaScript方法代码示例

    之前在一次机缘巧合的情况下,需要时用JAVA执行js方法,查阅了一些文档,找到了相关解决方法,这里和大家分享一下,这篇文章主要给大家介绍了关于JAVA调用JavaScript方法的相关资料,需要的朋友可以参考下
    2023-09-09

最新评论