关于class.getResourceAsStream() 与class.getClassLoader().getResourceAsStream()区别

来源:互联网 发布:食堂订餐软件 编辑:程序博客网 时间:2024/06/05 01:59

项目工程下读取文件的几种方式:

1.图片在src目录下;

这里写图片描述

相对路径:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream("getTclazz.jpg");//相对于src目录,使用相对路径,不加 /--------------------------------------------------------- InputStream inputStream = getClass().getResourceAsStream("/getTclazz.jpg"); /*此处的 '/' 相对于src目录*/

绝对路径:

InputStream inputStream = new FileInputStream("C:\\Users\\12746\\Workspaces\\MyEclipse 8.5\\firstJDBCPro2\\src\\getTclazz.jpg");------------------------------------------------------InputStream inputStream = new FileInputStream("C:/Users/12746/Workspaces/MyEclipse 8.5/firstJDBCPro2/src/getTclazz.jpg");

2.图片在dao目录下;

这里写图片描述

相对路径:

 InputStream inputStream =  getClass().getClassLoader().getResourceAsStream("com/jdbc/dao/getTclazz.jpg"); /*--/com/jdbc/dao/getTclazz.jpg 错误!!!--*/-------------------------------------------------------InputStream inputStream = getClass().getResourceAsStream("/com/jdbc/dao/getTclazz.jpg");//使用绝对路径---------------------------------------------------------调用的java类文件在该包下,【如测试类和文件都在com.jdbc.dao包下】则可使用: InputStream inputStream = getClass().getResourceAsStream("getTclazz.jpg");//使用相对路径时 ,相对的是该类所在的位置

绝对路径:

InputStream inputStream = new FileInputStream("C:/Users/12746/Workspaces/MyEclipse 8.5/firstJDBCPro2/src/com/jdbc/dao/getTclazz.jpg");-------------------------------------------------------InputStream inputStream = new FileInputStream("C:\\Users\\12746\\Workspaces\\MyEclipse 8.5\\firstJDBCPro2\\src\\com\\jdbc\\dao\\getTclazz.jpg");

分析:

1)InputStream inputStream = getClass().getResourceAsStream("getTclazz.jpg");2)InputStream inputStream = getClass().getResourceAsStream("/com/jdbc/dao/getTclazz.jpg");3)InputStream inputStream = getClass().getClassLoader().getResourceAsStream("com/jdbc/dao/getTclazz.jpg");

第一种和第二种方式是采用Class对象去加载,第三种采用ClassLoader对象去加载资源文件,之所以Class对象也可以加载资源文件是因为Class类封装的ClassLoader的getResourceAsStream方法。从Class类中的源码中可以看出:

public InputStream getResourceAsStream(String name) {        name = resolveName(name);        ClassLoader cl = getClassLoader0();        if (cl==null) {            // A system class.            return ClassLoader.getSystemResourceAsStream(name);        }        return cl.getResourceAsStream(name);    }

​​之所以这样做无疑还是方便客户端的调用,省的每次获取ClassLoader才能加载资源文件的麻烦。

路径问题:

  1. 第三种是最本质的做法,前两种也是基于第三种去实现的。JVM会使BootstrapLoader去加载资源文件。所以路径还是这种相对于工程的根目录即”com/jdbc/dao/getTclazz.jpg”(不需要“/”)。

  2. 第一种是采用的相对路径,资源文件相对于当前这个类的位置,这种方式Class对象做了一些处理。即resloveName(name)这个方法。最终name还是会转换成适合第三方式的name参数

  3. 第二种是采用绝对路径 [/],绝对路径是相对于classpath根目录的路径(工程里 “src” 目录,或服务器”/WEB-INF/classes”目录(存放.class文件的目录))。

3.图片在项目路径下-contextPath 下

这里写图片描述

相对路径:

InputStream inputStream = new FileInputStream("getTclazz.jpg");

绝对路径:

InputStream inputStream = new FileInputStream("C:\\Users\\12746\\Workspaces\\MyEclipse 8.5\\firstJDBCPro2\\getTclazz.jpg");

【4】不同路径的获取

  • 4.1 获取当前类路径
/C:/Users/12746/Workspaces/MyEclipse%208.5/Spring-2/WebRoot/WEB-INF/classes/com/web/test/path = this.getClass().getResource("").getPath();
  • 4.2 获取项目根路径
/*  获取工程根目录C:\Users\12746\Workspaces\MyEclipse 8.5\Spring-2 */path = System.getProperty("user.dir");
  • 4.3 获取类加载路径
1. / 表示相对于src目录;2. getClassLoader()只能使用相对路径        path = this.getClass().getResource("/").getPath();        /*/C:/Users/12746/Workspaces/MyEclipse%208.5/Spring-2/WebRoot/WEB-INF/classes/*/        path = this.getClass().getClassLoader().getResource("").getPath();

以上举例,文件在src或项目下,并没有在WebRoot下。如果文件在WebRoot下,请使用ServletContext获取。

0 0