Java中的getResourceAsStream有以下几种:
1. Class.getResourceAsStream(String path)
path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
当资源文件和类在同一级目录时,加不加/都可以。否则必须加/
Class.getResourceAsStream(String path)最终调用ClassLoader中的:
public static InputStream getSystemResourceAsStream(String name)
2. Class.getClassLoader.getResourceAsStream(String path)
默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
public InputStream getResourceAsStream(String name)
资源目录结构:
test文件夹设置为Resource Folder
idea中:Project Setting
如果设置为Sources 结果不太一样 (当资源文件和类在同一级目录时,CLassLoader加不加/都获取不到)
eclipse中有点build path--use Source folder
package com.learn;
import java.io.InputStream;
/**
* @Description (class和ClassLoader)getResourceAsStream加载资源文件测试
* @Author shixiaofei
* @Date 2019/7/27 21:56
* @Version 1.0
*/
public class Demo {
public static void main(String[] args) {
System.out.println("1.test文件夹已设置为Resource Folder,资源文件在test目录中");
demo1();
System.out.println("2.资源文件在src目录下");
demo2();
System.out.println("3.资源文件和类在同一目录");
demo3();
System.out.println("4.资源在src根目录下");
demo4();
}
/**
* 1.test文件夹已设置为Resource Folder
*/
private static void demo1() {
InputStream resourceAsStream1 = Demo.class.getClassLoader().getResourceAsStream("te.properties");
String message1 = resourceAsStream1 == null ? "ClassLoader(不+/)获取不到" : "ClassLoader(不+/)可以获取";
System.out.println("\t" + message1);
InputStream resourceAsStream2 = Demo.class.getClassLoader().getResourceAsStream("/te.properties");
String message2 = resourceAsStream2 == null ? "ClassLoader(+/)获取不到" : "ClassLoader(+/)可以获取";
System.out.println("\t" + message2);
InputStream resourceAsStream3 = Demo.class.getResourceAsStream("te.properties");
String message3 = resourceAsStream3 == null ? "class(不+/)获取不到" : "class(不+/)可以获取";
System.out.println("\t" + message3);
InputStream resourceAsStream4 = Demo.class.getResourceAsStream("/te.properties");
String message4 = resourceAsStream4 == null ? "class(+/)获取不到" : "class(+/)可以获取";
System.out.println("\t" + message4);
}
/**
* 2.资源文件在src目录下的config文件夹中
*/
private static void demo2() {
InputStream resourceAsStream1 = Demo.class.getClassLoader().getResourceAsStream("config/mysql2.properties");
String message1 = resourceAsStream1 == null ? "ClassLoader(不+/)获取不到" : "ClassLoader(不+/)可以获取";
System.out.println("\t" + message1);
InputStream resourceAsStream2 = Demo.class.getClassLoader().getResourceAsStream("/config/mysql2.properties");
String message2 = resourceAsStream2 == null ? "ClassLoader(+/)获取不到" : "ClassLoader(+/)可以获取";
System.out.println("\t" + message2);
InputStream resourceAsStream3 = Demo.class.getResourceAsStream("config/mysql2.properties");
String message3 = resourceAsStream3 == null ? "class(不+/)获取不到" : "class(不+/)可以获取";
System.out.println("\t" + message3);
InputStream resourceAsStream4 = Demo.class.getResourceAsStream("/config/mysql2.properties");
String message4 = resourceAsStream4 == null ? "class(+/)获取不到" : "class(+/)可以获取";
System.out.println("\t" + message4);
}
/**
* 3.资源文件和类在同一目录
*/
private static void demo3() {
InputStream resourceAsStream1 = Demo.class.getClassLoader().getResourceAsStream("mysql.properties");
String message1 = resourceAsStream1 == null ? "ClassLoader(不+/)获取不到" : "ClassLoader(不+/)可以获取";
System.out.println("\t" + message1);
InputStream resourceAsStream2 = Demo.class.getClassLoader().getResourceAsStream("/mysql.properties");
String message2 = resourceAsStream2 == null ? "ClassLoader(+/)获取不到" : "ClassLoader(+/)可以获取";
System.out.println("\t" + message2);
InputStream resourceAsStream3 = Demo.class.getResourceAsStream("mysql.properties");
String message3 = resourceAsStream3 == null ? "class(不+/)获取不到" : "class(不+/)可以获取";
System.out.println("\t" + message3);
InputStream resourceAsStream4 = Demo.class.getResourceAsStream("/mysql.properties");
String message4 = resourceAsStream4 == null ? "class(+/)获取不到" : "class(+/)可以获取";
System.out.println("\t" + message4);
}
/**
* 资源在src根目录下
*/
private static void demo4() {
InputStream resourceAsStream1 = Demo.class.getClassLoader().getResourceAsStream("mysql3.properties");
String message1 = resourceAsStream1 == null ? "ClassLoader(不+/)获取不到" : "ClassLoader(不+/)可以获取";
System.out.println("\t" + message1);
InputStream resourceAsStream2 = Demo.class.getClassLoader().getResourceAsStream("/mysql3.properties");
String message2 = resourceAsStream2 == null ? "ClassLoader(+/)获取不到" : "ClassLoader(+/)可以获取";
System.out.println("\t" + message2);
InputStream resourceAsStream3 = Demo.class.getResourceAsStream("mysql3.properties");
String message3 = resourceAsStream3 == null ? "class(不+/)获取不到" : "class(不+/)可以获取";
System.out.println("\t" + message3);
InputStream resourceAsStream4 = Demo.class.getResourceAsStream("/mysql3.properties");
String message4 = resourceAsStream4 == null ? "class(+/)获取不到" : "class(+/)可以获取";
System.out.println("\t" + message4);
}
}
输出结果:
1.test文件夹已设置为Resource Folder,资源文件在test目录中
ClassLoader(不+/)可以获取
ClassLoader(+/)获取不到
class(不+/)获取不到
class(+/)可以获取
2.资源文件在src目录下
ClassLoader(不+/)可以获取
ClassLoader(+/)获取不到
class(不+/)获取不到
class(+/)可以获取
3.资源文件和类在同一目录
ClassLoader(不+/)获取不到
ClassLoader(+/)获取不到
class(不+/)可以获取
class(+/)获取不到
4.资源在src根目录下
ClassLoader(不+/)可以获取
ClassLoader(+/)获取不到
class(不+/)获取不到
class(+/)可以获取
待完善。。。
3. ServletContext. getResourceAsStream(String path)
默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,当然这和具体的容器实现有关。
4. Jsp下的application内置对象就是上面的ServletContext的一种实现。