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"); } } }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持易知道(ezd.cc)。 

推荐阅读