getResourceAsStream的用法
- Class.getResourceAsStream(String path): path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。只是通过path构造一个绝对路径,最终由ClassLoader获取资源。
- Class.getClassLoader().getResourceAsStream(String path) : 默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
- ServletContext.getResourceAsStream(String path): 默认从WebAPP根目录下取资源。 Jsp下的application内置对象就是上面的ServletContext的一种实现。
getResourceAsStream 用法大致有以下几种:
- 要加载的文件和.class文件在同一目录下:
eg:com.x.y 下有类me.class ,同时有资源文myfile.xml。
me.class.getResourceAsStream("myfile.xml"); - 在me.class目录的子目录下:
eg: com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml。
如下:me.class.getResourceAsStream("file/myfile.xml"); - 不在me.class目录下,也不在子目录下 :
eg:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml。
如下:me.class.getResourceAsStream("/com/x/file/myfile.xml");
总结一下:
第一:前面有 “ / ”: 代表了工程的根目录classpath
me.class.getResourceAsStream("/com/x/file/myfile.xml");
第二:前面没有 “ / ”: 代表当前类的目录
me.class.getResourceAsStream("file/myfile.xml");
读取资源文件的方法
/** 使用java.util.Properties类的load()方法 **/
Properties p = new Properties();
p.load(Test.class.getResourceAsStream("pathName"));
p.getProperty("key");
/** 使用java.util.ResourceBundle类的getBundle()方法 **/
ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault()); //根据指定国家/语言环境加载资源文件
String s = bundle.getString("key");
/** 使用java.util.PropertyResourceBundle类的Constructor **/
InputStream in = new BufferedInputStream(new FileInputStream(name));
ResourceBundle rb = new PropertyResourceBundle(in);
/** bufferedReader 的 readLine **/
InputStream resourceAsStream = Test.class.getResourceAsStream("pathName");
InputStreamReader in = new InputStreamReader(resourceAsStream,"utf-8");
BufferedReader fileReader = new BufferedReader(in);
String tempString = fileReader.readLine(); //获取资源文件中的每行数据
java.util.ResourceBundle
这个类的作用就是读取资源属性文件(.properties),然后根据.properties文件的名称信息(本地化信息),匹配当前系统的国别语言信息(也可以程序指定),然后获取相应的properties文件的内容。
properties文件名字一般的命名规范是:自定义名_语言代码_国别代码.properties,默认为:自定义名.properties。没有提供语言和地区的资源文件是系统默认的资源文件。
eg:myres_en_US.properties 、myres_zh_CN.properties 、myres.properties
当在中文操作系统下,如果myres_zh_CN.properties、myres.properties两个文件都存在,则优先会使用myres_zh_CN.properties,当myres_zh_CN.properties不存在时候,会使用默认的myres.properties。
public class TestResourceBundle {
public static void main(String[] args) {
Locale locale1 = new Locale("zh", "CN");
ResourceBundle resb1 = ResourceBundle.getBundle("myres", locale1);
System.out.println(resb1.getString("aaa"));
ResourceBundle resb2 = ResourceBundle.getBundle("myres", Locale.getDefault());
System.out.println(resb1.getString("aaa"));
Locale locale3 = new Locale("en", "US");
ResourceBundle resb3 = ResourceBundle.getBundle("myres", locale3);
System.out.println(resb3.getString("aaa"));
}
}