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

目录
  • Java将jar包内文件资源释放出来
  • 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");
        }  

    }
}  

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

(0)

相关推荐

  • java命令执行jar包的多种方法(四种方法)

    大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口. 具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件. 比如有个叫做test.jar的jar包,里面有一个拥有main函数的main class:test.someClassName 我们就只要在MANIFEST.MF里面添加如下一句话: Main-Class: test.someClassName 然后我们可以在控制台里输入java

  • 详解Java读取Jar中资源文件及示例代码

    详解Java读取Jar中资源文件及实现代码 直接上代码,文章的注释部分说的比较清楚,大家可以参考下, 工具类源代码: ResourceLoadFromJarUtil.java 实现代码: import java.io.IOException; import java.io.InputStream; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URL; import

  • Java内存释放实现代码案例

    先贴代码: StringBuilder dada = null; for(int i=0; i<1000; i++){ dada = new StringBuilder(); for(int j=0; j<1000; j++){ dada.append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); } } System.out.println("释放前"); StringBuilder dad

  • Java关于jar包的知识详解

    在学习jar包之前,要先弄懂Java包,以及关于Java包的相关概念. 一.包 为了更好地组织类,Java提供了包机制.包是类的容器,用于分隔类名空间.如果没有指定包名,所有的示例都属于一个默认的无名包. 格式为: package pkg1[.pkg2[.pkg3-]]: 代码实例: package cn.com.zhouzhou;//包名一定要由小写字母组成 public class Lession1 { public static void main(String[] args) { Sys

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

    目录 Java将jar包内文件资源释放出来 jar包的动态加载和释放 Java将jar包内文件资源释放出来 有些时候我们需要读取并释放jar包内文件到jar包外.这样其实很简单,使用InputStream和OutputStream即可. 文件在jar包中时,一般是先读取他们,再输出.以我这里为例: 可以看到我这里的代码文件目录结构,代码文件夹根目录下有一个a.txt,还有一个test文件夹,其中有一个Test类和b.txt,sda.pdf. 打包为jar后结构不变,如下: 现在演示文件输出,把j

  • Java 获取 jar包以外的资源操作

    在使用 jar 执行 java 代码时,有一个需求是从 jar 包所在目录的同级目录下读取配置文件的需求,从网上找了很多方法感觉都挺复杂的, 在这里总结一下. 以classpath 开头的 URL 表示该文件为jar包内文件的路径. 如:classpath://config/app.config表示jar包根路径config文件夹下的app.config文件 以file开头的URL表示该文件为jar 包外文件的路径 如:file://./config/app.config表示 摘要 // 当前我

  • Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法

    Kettle中使用JavaScript调用jar包对文件内容进行MD5加密.本文主要知识点: JavaScript调用jar包对文件内容进行MD5加密,返回加密md5值 Kettle实现对文件内容的加密,返回加密md5值 2.使用方法 1)下载jar包 http://xiazai.jb51.net/202009/yuanma/filemd5hash_jb51.rar 2)将jar包导入Kettle的lib目录下 3)重启Kettle Spoon.bat,使得kettle加载到新加入的jar包,下

  • 详谈Java中net.sf.json包关于JSON与对象互转的坑

    在Web开发过程中离不开数据的交互,这就需要规定交互数据的相关格式,以便数据在客户端与服务器之间进行传递.数据的格式通常有2种:1.xml:2.JSON.通常来说都是使用JSON来传递数据.本文正是介绍在Java中JSON与对象之间互相转换时遇到的几个问题以及相关的建议. 首先明确对于JSON有两个概念: JSON对象(JavaScript Object Notation,JavaScript对象表示法).这看似只存是位JavaScript所定制的,但它作为一种语法是独立于语言以及平台的.只是说

  • Java 动态加载jar和class文件实例解析

    本文研究的主要是Java 动态加载jar和class文件的相关内容,具体如下. JAVA中类文件加载是动态的.也就是说当我们用到的时候才会去加载,如果不用的话,就不会去加载我们的类. JAVA为我们提供了两种动态机制.第一种是隐式机制.第二种是显示机制.如下: 两种方法: 隐式机制 :new一个对象 + 调用类的静态方法 显式机制 :由 java.lang.Class的forName()方法加载 由 java.lang.ClassLoader的loadClass()方法加载 1.Class.fo

  • 使用IDEA将Java/Kotliin工程导出Jar包的正确姿势

    导出的 Jar 包无法运行? 导出的 Jar 包找不到 Main class? 大概是我对导出 Jar 包的理解不深吧,反正一直不太懂 IDEA 导出 Jar 包的界面和功能到底怎么用.但总算是自己摸索出了正确的方法. 第一步:添加构建 首先要介绍的是 Artifact 这个概念,可以理解为一种构建,比如说 Android Studio 构建出来的 Artifact 就是 Apk 文件.Java 程序当然是可以构建出 Jar 包的. 在一个 Java 或 Kotlin 工程中,在 IDEA 的顶

  • Android 如何实现exclude aar包中的某个jar包

    场景一 要移除的jar包不在aar包中的classes.jar中 直接把aar包里的Jar打包的时候给去掉,就像下面这这样.注意,要使用exclude module这种方式,直接使用exclude group方式没有效果.exclude group的方法适用于exclude JAR包中的文件. implementation(name: '×××××××aar包', ext: 'aar') { exclude module: 'gson' } 场景二 要移除的jar包在aar包中的classes.

  • Java之maven打完jar包之后将jar包放到指定位置汇总

    目录 前言 方式一 方式二 方式三 方式四 方式五 总结 前言 maven打完jar包之后,默认放置位置是target目录 有时候项目需要,如何将jar包放置到指定的目录呢? 方式一 通过maven-jar-plugin指定outputDirectory输出路径 可以排除某些配置文件,没有文件夹的话会自动创建! <plugin>     <groupId>org.apache.maven.plugins</groupId>     <artifactId>m

  • java动态添加外部jar包到classpath的实例详解

    java动态添加外部jar包到classpath的实例详解 前言: 在项目开发过程中我们有时候需要动态的添加外部jar包,但是具体的业务需求还没有遇到过,因为如果动态添加外部jar包后,我们就需要修改业务代码,而修改代码就需要重新启动服务,那样好像就没有必要动态添加外部jar包了,怎么样才能不重新启动服务器就可以使用最新的代码我没有找到方法,如果各位知道的话给我点建议,回归主题,实现动态添加外部jar包到classpath的方法如下: String beanClassName = "com.dy

  • Android Studio 在项目中引用第三方jar包的方法

    在Android Studio项目中引用第三方jar包的方法: 步骤: 1.在build.gradle文件中添加如下代码: 备注:要添加在Android作用域下 sourceSets { main { jniLibs.srcDirs = ['libs'] } } 点击[Sync Now],会生成jniLibs文件夹 找到jniLibs文件夹对应的实体目录,把需要用到的jar包放到该目录下 在build.gradle文件中,在dependencies模块,添加以下代码: compile files

随机推荐