目录
读取jar包中文件
概述
1、ClassLoader 是类加载器的抽象类。它可以在运行时动态的获取加载类的运行信息。 可以这样说,当我们调用ResourceJar.jar中的Resource类时,JVM加载进Resource类,并记录下Resource运行时信息(包括Resource所在jar包的路径信息)。而ClassLoader类中的方法可以帮助我们动态的获取这些信息:
● public URL getResource(String name)
查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。并返回资源的URL对象。
● public InputStream getResourceAsStream(String name);
返回读取指定资源的输入流。这个方法很重要,可以直接获得jar包中文件的内容。
2、ClassLoader是abstract的,不可能实例化对象,更加不可能通过ClassLoader调用上面两个方法。所以我们真正写代码的时候,是通过Class类中的getResource()和getResourceAsStream()方法,这两个方法会委托ClassLoader中的getResource()和getResourceAsStream()方法 。
若我们要访问项目中的资源文件,则一般使用相对路径或者用System.getProperities("user.dir")得到项目根目录,然后再访问资源文件,但是在将该工程和资源文件打包为jar包,运行该jar文件时,会显示找不到资源文件的错误。
解决方法:使用Class.getResource或者是ClassLoader.getResourceAsStream()将文件内容放到InputStream中,具体使用如下:
String s1 = this.getClass().getResource("/library.properties").getPath();
注意,使用class的getRescource时,要注意路径前要加"/",即根目录,此处的根目录是src
在使用ClassLoader时,路径前面不能加"/",使用相对路径。
@Test
public void demo(){
System.out.println(System.getProperty("user.dir"));
String class_str2 = this.getClass().getResource("/logback-spring.xml").getPath();
String classLoader_str = this.getClass().getClassLoader().getResource("logback-spring.xml").getPath();
InputStream is = this.getClass().getClassLoader().getResourceAsStream("logback-spring.xml");
System.out.println(class_str2);
System.out.println(classLoader_str);
System.out.println(is == null );
}
E:\idea_workspace\yanchang
/E:/idea_workspace/yanchang/target/classes/logback-spring.xml
/E:/idea_workspace/yanchang/target/classes/logback-spring.xml
false
读取jar外部文件
文件目录结构如下图
data里面放着我们要访问的数据,数据如下图所示
code.jar是可执行jar包,jar包中的代码欲访问data中的数据,那么我们可以在jar包中的任何类中编写一下代码即可访问与jar包同目录下的文件了
File file = new File(System.getProperty("user.dir") + "/data/a.txt");
System.getProperty("user.dir")执行结果在eclipse工程和jar包中是不一样的
- 在eclipse中,返回的是工程根目录(不是bin目录)即D:\code\test_project
- 在命令行中运行jar包,返回的是jar包所在的目录,比如上面例子中就是返回D:\code