关于读取资源文件(如文本文件、图像、二进制文件等),一般不推荐直接给出操作系统的路径,而是给出相对于当前类的相对路径,这样就可以使用类的装载器来装载资源文件。常用的方法有:
Class类的getResourceAsStream(String resourcePath);
ClassLoader类的getResourceAsStream(String resourcePath)
Class类的该方法最终还是委派给ClassLoader的getResourceAsStream方法,但是使用中发现Class#getResourceAsStream()使用的是绝对路径(以/开头),而ClassLoader#getResourceAsStream()使用的相对路径。
propterty文件经常放在类路径的根路径下(最顶层包的上层目录,如classes),这样加载property文件时就可以先用Class#getResourceAsStream方法获取输入源,再从该输入源load各entry。
code piece:
    
        
            
            | package sinpo.usagedemo;
 import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.Properties;
 
 import junit.framework.TestCase;
 
 /**
 * @author 徐辛波(sinpo.xu@hotmail.com)
 * Oct 19, 2008
 */
 public class LoadResource extends TestCase {
 public void test() throws Exception {
 //usage 1: use absolute path (mostly used)
 InputStream in1 = this.getClass().getResourceAsStream("/sinpo/test2.properties");
 //usage 2: use relative path
 InputStream in2 = this.getClass().getClassLoader().getResourceAsStream("sinpo/test2.properties");
 //usage 3: use system class path
 InputStream in3 = ClassLoader.getSystemResourceAsStream("system.properties");
 
 //将读取的资源作为Properties的输入源
 Properties props = new Properties();
 props.load(in1);
 String propValue = props.getProperty("propKey");
 System.out.println(propValue);
 
 //将读取的资源作为文本输出
 InputStreamReader reader = new InputStreamReader(in1);
 BufferedReader bReader = new BufferedReader(reader);
 String content = bReader.readLine();
 //输出第一行内容
 System.out.println(content);
 
 //TODO close them
 }
 }
 |