Java的项目(资源或者配置)文件的加载总结
2017-07-27 14:45
531 查看
首先我用的是Mac环境, Maven项目; 如图项目结构如下:
话不多说,上代码:
先看 getClass().getResourcepublic void test1() throws IOException {
System.out.println(this.getClass().getResource(""));
// file:/usr/eclipse/my_workspace/test.path/target/classes/com/test/sh/
// 是类所在的 绝对路径 (就是类的包目录绝对路径)
System.out.println(this.getClass().getResource("/"));
// file:/usr/eclipse/my_workspace/test.path/target/classes/
// 项目的CLASSPATH 根目录
System.out.println(this.getClass().getResource("/test.sh"));
// file:/usr/eclipse/my_workspace/test.path/target/classes/test.sh
// 去项目的CLASSPATH 目录下 寻找文件
System.out.println(this.getClass().getResource("/subfile/test22.sh"));
// file:/usr/eclipse/my_workspace/test.path/target/classes/subfile/test22.sh
// 去项目的CLASSPATH 下 特定的目录寻找文件, 有几层写几层
}
测试的结果是输出结果写在代码下面的注释里 ; 再看下 Class.getClassLoader().getResource(String path);
然后是:
接着测试 Class.getResourceAsStream 和ClassLoader.getResourceAsStream :
好了看了这么多代码的测试, 也是眼花缭乱, 不要急, 静下来总结的时候到了. 从结果来看:
【 this.getClass().getResource("/") == this.getClass().getClassLoader().getResource("") 】
Class.getResource和Class.getResourceAsStream在使用时路径选择上是一样的。
Class.getClassLoader().getResource和Class.getClassLoader().getResourceAsStream在使用时路径选择上也是一样的。
我们可以总结到:
1. Class.getResourceAsStream(String path) :
不以'/'开头时默认是从此类所在的包下取资源,以'/'开头则是从ClassPath 根下获取,多次目录时, 文件有几层写几层。
跟源码发现其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
2. Class.getClassLoader.getResourceAsStream(String path) :
默认则是从ClassPath根下获取,path不能以'/'开头,否则会报错; 多次目录时, 还是中间的子目录几层写几层
写在最后: 可以自己复制这些测试代码, 然后自己测试一下, 基本上这些文件在不同的位置怎么获取都了如指掌了! 您说呢.
话不多说,上代码:
先看 getClass().getResourcepublic void test1() throws IOException {
System.out.println(this.getClass().getResource(""));
// file:/usr/eclipse/my_workspace/test.path/target/classes/com/test/sh/
// 是类所在的 绝对路径 (就是类的包目录绝对路径)
System.out.println(this.getClass().getResource("/"));
// file:/usr/eclipse/my_workspace/test.path/target/classes/
// 项目的CLASSPATH 根目录
System.out.println(this.getClass().getResource("/test.sh"));
// file:/usr/eclipse/my_workspace/test.path/target/classes/test.sh
// 去项目的CLASSPATH 目录下 寻找文件
System.out.println(this.getClass().getResource("/subfile/test22.sh"));
// file:/usr/eclipse/my_workspace/test.path/target/classes/subfile/test22.sh
// 去项目的CLASSPATH 下 特定的目录寻找文件, 有几层写几层
}
测试的结果是输出结果写在代码下面的注释里 ; 再看下 Class.getClassLoader().getResource(String path);
public void test2() { //测试: Class.getClassLoader().getResource(String path); System.out.println(this.getClass()); //输出: class com.test.sh.TestPath System.out.println(this.getClass().getClassLoader()); //输出: sun.misc.Launcher$AppClassLoader@4554617c System.out.println(this.getClass().getClassLoader().getResource("")); //结果: file:/usr/eclipse/my_workspace/test.path/target/classes/ // 项目的CLASSPATH 根目录 System.out.println(this.getClass().getClassLoader().getResource("/")); //结果: null 说明这种不能以’/'开头时; System.out.println(this.getClass().getClassLoader().getResource("/test.sh")); // 同样为空 System.out.println(this.getClass().getClassLoader().getResource("test.sh")); //结果: file:/usr/eclipse/my_workspace/test.path/target/classes/test.sh System.out.println(this.getClass().getClassLoader().getResource("subfile/test22.sh")); //结果: file:/usr/eclipse/my_workspace/test.path/target/classes/subfile/test22.sh }接下来是:
public void test3() { System.out.println(System.getProperty("user.dir")); // 结果:/usr/eclipse/my_workspace/test.path //当前工程路径 } public void test4() { System.out.println(System.getProperty("java.class.path")); // 结果:/usr/eclipse/my_workspace/test.path/target/classes // 当前工程的 classpath 路径 }
然后是:
public void test5() throws IOException { File f = new File( "test_class_getResourceAsStream.txt" ); System.out.println( f.getAbsolutePath() ); InputStream resourceAsStream = this.getClass().getResourceAsStream("/test.sh"); // 如果以 '/' 开头的,那么就会从classpath的根路径下开始查找指定的文件。 inputstreamToFile( resourceAsStream, f ); }
接着测试 Class.getResourceAsStream 和ClassLoader.getResourceAsStream :
public void test6() throws IOException { File f = new File( "test_Class_getClassLoader_getResourceAsStream.txt" ); InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("test22.sh"); //不能以 '/' 开头 ; 从classpath的根路径下开始查找指定的文件 InputStream resourceAsStream2 = this.getClass().getClassLoader().getResourceAsStream("subfile/test22.sh"); //不能以 '/' 开头 ; 从classpath的根路径下开始查找指定的文件。有几层写几层 inputstreamToFile( resourceAsStream, f ); } public static void inputstreamToFile(InputStream ins, File file) throws IOException { OutputStream os = new FileOutputStream(file); int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { os.write(buffer, 0, bytesRead); } os.close(); ins.close(); }
好了看了这么多代码的测试, 也是眼花缭乱, 不要急, 静下来总结的时候到了. 从结果来看:
【 this.getClass().getResource("/") == this.getClass().getClassLoader().getResource("") 】
Class.getResource和Class.getResourceAsStream在使用时路径选择上是一样的。
Class.getClassLoader().getResource和Class.getClassLoader().getResourceAsStream在使用时路径选择上也是一样的。
我们可以总结到:
1. Class.getResourceAsStream(String path) :
不以'/'开头时默认是从此类所在的包下取资源,以'/'开头则是从ClassPath 根下获取,多次目录时, 文件有几层写几层。
跟源码发现其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
2. Class.getClassLoader.getResourceAsStream(String path) :
默认则是从ClassPath根下获取,path不能以'/'开头,否则会报错; 多次目录时, 还是中间的子目录几层写几层
写在最后: 可以自己复制这些测试代码, 然后自己测试一下, 基本上这些文件在不同的位置怎么获取都了如指掌了! 您说呢.
相关文章推荐
- SpringMVC_v02中的总结(web项目、java项目中引入Config.properties,加载hibernate映射文件的配置的区别)
- 资源加载 - 相对路径获取JAVA配置文件
- Java或者JAR包获取读取资源文件的路径的问题总结
- eclipse修改java代码或者其他一些资源例如配置文件,freemarker文件时tomcat不自动重启的方法
- 一个java web项目classpath配置文件加载类
- Java或者JAR包获取读取资源文件的路径的问题总结
- Java中加载配置文件方式的总结
- java 高新技术【6】 反射开发框架以及用 类加载器 管理资源和配置文件
- 遇到问题----java----myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件
- java 高新技术【6】 反射开发框架以及用 类加载器 管理资源和配置文件
- nginx 配置后网站图片或js 加载出来一半或者不出来刷新才可以,chrome 浏览器访问项目时加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH:
- javaWeb-web项目中加载资源文件路径的两种方式
- Spring学习总结(20)——Spring加载多个项目properties配置文件问题解决
- tomcat6配置java项目启动动态加载配置文件
- java加载资源文件方式总结
- Java中加载配置文件的方法总结
- java项目中程序加载配置文件的几种写法
- Spring学习总结(20)——Spring加载多个项目properties配置文件问题解决
- java项目加载配置文件的工具类
- 遇到问题----java----myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件