Java中实现将jar包内文件资源释放出来

 更新时间:2022年08月17日 09:24:20   作者:「已注销」  
这篇文章主要介绍了Java中实现将jar包内文件资源释放出来的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Java将jar包内文件资源释放出来

有些时候我们需要读取并释放jar包内文件到jar包外。这样其实很简单,使用InputStream和OutputStream即可。

文件在jar包中时,一般是先读取他们,再输出。以我这里为例:

可以看到我这里的代码文件目录结构,代码文件夹根目录下有一个a.txt,还有一个test文件夹,其中有一个Test类和b.txt,sda.pdf。

打包为jar后结构不变,如下:

 

现在演示文件输出,把jar包内的test文件夹里面的那个sda.pdf输出,代码如下:

InputStream is = Test.class.getResourceAsStream("sda.pdf");// 流式读取jar包内文件,使用classpath
File f = new File("E:\\中转\\tio\\a\\out.pdf");// 指定输出文件
File fp = new File(f.getParent());// 输出文件的父目录
if (!fp.exists()) {// 父目录不存在时先创建
	fp.mkdirs();
}
if (!f.exists()) {// 文件不存在时先创建
	f.createNewFile();
}
OutputStream os = new FileOutputStream(f);// 创建输出流
int index = 0;// 当前读取的位数
byte[] bytes = new byte[1024];// 指定每次读取的位数,这里以1024为例
// 开始读取文件,一遍读取一边输出文件。每次读取1024的长度并储存于bytes这个数组中,然后写入至目标文件
while ((index = is.read(bytes)) != -1) {
	os.write(bytes, 0, index);// 输出文件,write()方法参数分别为:写入的数据、开始写入的位置(0为从开头写入),写入长度
}
// 关闭流并保存文件
os.flush();
os.close();
is.close();

这里要说明的重点是

InputStream is = Test.class.getResourceAsStream("sda.pdf");

这就是流式读取文件,其语法是:

InputStream is = 类名.class.getResourceAsStream("文件路径");

这里因为是读取jar内的文件,所以路径用classpath方式表示。上面的Test.class.getResourceAsStream()就是以Test这个类的位置为出发点。括号里面的参数就是在jar包中,以Test类为准的相对路径。

当然也可以使用绝对路径。文件路径以"/"开头的就是绝对路径,绝对路径不再是以类为出发点,/就代表jar包的根目录。

举个例子:

如果要读取上述jar包内根目录下的a.txt,那就要这样写:

InputStream is = Test.class.getResourceAsStream("/a.txt");

这时就是以绝对路径方式找到文件。虽然指定了Test.class,但是因为是绝对路径,路径就与Test类无关了。

jar包的动态加载和释放

import sun.misc.ClassLoaderUtil;  
import java.io.File;  
import java.lang.reflect.Constructor;  
import java.lang.reflect.Method;  
import java.net.MalformedURLException;  
import java.net.URL;  
import java.net.URLClassLoader;  
  
/** 
 * java jar的动态加载和释放 
 */  
public class TestMain {  
  
  
    public static void main(String[] args) throws MalformedURLException, Exception {  
  
        System.out.println(new File(".").getAbsolutePath());  
        URLClassLoader urlClassLoader=new URLClassLoader(new URL[]{new URL("file:C:\\Users\\Administrator\\IdeaProjects\\test\\data.jar")});  
       Class classStudentServiceImpl=  urlClassLoader.loadClass("StudentServiceImpl");  
       Method method= classStudentServiceImpl.getMethod("getName",new Class[]{});  
        Constructor localConstructor = classStudentServiceImpl.getConstructor(new Class[] {});  
        Object instance = localConstructor.newInstance(new Object[] {});  
       Object ret= method.invoke(instance);  
        System.out.println(ret);  
  
        ClassLoaderUtil.releaseLoader(urlClassLoader);  
        while(true)  
        {  
            Thread.sleep(1000);  
            System.out.println("run");  
        }  
  
  
    }  
}  

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • Java数据类型超详细示例讲解

    Java数据类型超详细示例讲解

    Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。本文将通过示例详细说说Java中数据类型的转换,感兴趣的可以了解一下
    2022-11-11
  • Spring的异常重试框架Spring Retry简单配置操作

    Spring的异常重试框架Spring Retry简单配置操作

    这篇文章主要介绍了Spring的异常重试框架Spring Retry简单配置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Spring Data Jpa 复合主键的实现

    Spring Data Jpa 复合主键的实现

    这篇文章主要介绍了Spring Data Jpa 复合主键的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java虚拟机之双亲委派机制详解

    Java虚拟机之双亲委派机制详解

    这篇文章主要为大家介绍了Java虚拟机之双亲委派机制,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • MyBatis学习教程(二)—如何使用MyBatis对users表执行CRUD操作

    MyBatis学习教程(二)—如何使用MyBatis对users表执行CRUD操作

    这篇文章主要介绍了MyBatis学习教程(二)—如何使用MyBatis对users表执行CRUD操作的相关资料,需要的朋友可以参考下
    2016-05-05
  • new出来的对象中无法使用@autowired进行对象bean注入问题

    new出来的对象中无法使用@autowired进行对象bean注入问题

    这篇文章主要介绍了基于new出来的对象中无法使用@autowired进行对象bean注入问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot请求参数传递与接收说明小结

    SpringBoot请求参数传递与接收说明小结

    这篇文章主要介绍了SpringBoot请求参数传递与接收,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • @ComponentScan注解用法之包路径占位符解析

    @ComponentScan注解用法之包路径占位符解析

    这篇文章主要介绍了@ComponentScan注解用法之包路径占位符解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 使用迭代器模式来进行Java的设计模式编程

    使用迭代器模式来进行Java的设计模式编程

    这篇文章主要介绍了使用迭代器模式来进行Java的设计模式编程,文中对迭代器模式中的容器封装方面的知识进行了讲解,需要的朋友可以参考下
    2016-02-02
  • hdfs集成springboot使用方法

    hdfs集成springboot使用方法

    这篇文章主要介绍了hdfs集成springboot使用,配置Configuration信息分为两种方式,每种方式给大家介绍的非常详细,需要的朋友可以参考下
    2024-03-03

最新评论