getResourceAsStream的解析2010-04-30 14:00
package cn.com.TestXml;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class TestStructs {
InputStream in = getClass().getResourceAsStream( "prop.properties" );
public static void main(String[] args){
TestStructs ts = new TestStructs();
Properties pro = new Properties();
try {
pro.load(ts.in);
} catch (IOException e) {
e.printStackTrace();
}
String str = pro.getProperty( "username" );
System.out.println(str);
if (ts.in != null )
System.out.println( "wo zhao dao le " );
else
System.out.println( "我找不到文件啊" );
}
}我用的是eclipse
首先说明:prop.properties放在工程目录下!!然后用( "prop.properties" )测试 异常。然后用( "/prop.properties" );通过!
可以说明
/ 代表的是工程目录。也就是说有了/ 就会先在工程目录找。如果把 prop.properties放在工程下令一个包例如 cn.com.node 那么路径就相应为/cn/com/node/prop.properties.也就是说可以跨目录读取文件。但前提是有/
如果路径为“prop.properties” 那么就必须将prop.properties放在类的同一包里 。在使用Class.getResourceAsStream 时, 资源路径有两种方式, 一种以 / 开头,则这样的路径是指定绝对
路径, 如果不以 / 开头, 则路径是相对与这个class所在的包的。
在使用ClassLoader.getResourceAsStream时, 路径直接使用相对于classpath的绝对路径。
还有一些我摘自其他人的:
老兄和我犯的错误是一样的:
要区分Class的getResourceAsStream和ClassLoader的getResourceAsStream方法。
ClassLoader的该方法如果name以/开头那么就什么也找不到了。
而Class的getResourceAsStream方法如果name以/开头那么就把/以后的name传递给ClassLoader的
getResourceAsStream方法。如果不已/开头那么将该class的包名加上name作为参数(用/代替.)之后
传给ClassLoader的对应方法。
看一下程序:
package com.test;
import java.io.*;
public class UseResourceTest {
public static void main(String[] args) throws Exception {
UseResourceTest test = new UseResourceTest();
InputStream in = test.getClass().getResourceAsStream( "a.txt" );
System. out .println(in);
}
}
效果相当于:
package com.test;
import java.io.*;
public class UseResourceTest {
public static void main(String[] args) throws Exception {
InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream( "com/test/a.txt" );
System.out.println(in);
读取属性文件事例:
import java.io.IOException;
import java.util.Properties;
/**
* 读取属性文件
*
*/
public class CSTConfig {
private Properties p = null ;
public CSTConfig(){
}
public Properties load(Class<?> clazz,String propertiesName){
if ( null == p ){
p = new Properties();
}
try {
p .load(clazz.getResourceAsStream(propertiesName));
} catch (IOException e) {
e.printStackTrace();
}
return p ;
}
public String getProperty(String key){
if ( null == p )
return null ;
return p .getProperty(key);
}
}