利用Class.getResource或ClassLoader.getResource加载资源 这样可以避免系统的依赖性。

最明显的例子就是:创建File对象,使用new File(String pathname) 构造函数,pathname就跟系统绑定在一起了,win和linux下面路径表示各不相同。

 

可以使用new File(URI uri)来创建File对象。URI可以由Class.getResource或ClassLoader.getResource得到的URL.toURI()得到。

Class.getResource(String name)最终会调用ClassLoader.getResource(String name)的方法

两个方法都使用 '/' 分隔符, 但两者对于参数的处理不相同:

 

Class.getResource(String name)分两种情况:

 a1: 以 '/' 开头的name表示绝对路径;

 a2: 其他都表示相对路径。

ClassLoader.getResource(String name)只有一种情况:

不能以 '/' 开头 而且只表示绝对路径

 

另外对于Class和ClassLoader里面的getResourceAsStream   ClassLoader.getSystemResource和getSystemResourceAsStream

 参数处理都是如此情况。

 

还有个ResourceBundle.getBundle(),可以查看这个链接:

http://www.javaworld.com/javaqa/2003-08/01-qa-0808-property.html?page=2 

 

具体见代码

 https://github.com/doubledouble/me/blob/master/src/iven/io/file/FileTest.java

package iven.io.file;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class FileTest {

    /**
     * @param args
     * @throws IOException 
     * @throws URISyntaxException 
     */
    public static void main(String[] args) throws IOException, URISyntaxException {
        String relative_Path_4_class = "a.txt"; 
        String absoulte_Path_4_class = "/iven/io/file/a.txt";      // class 以'/'开头表示绝对路径, 其他情况表示相对路径
        String absoulte_Path_4_classLoader = "iven/io/file/a.txt"; // classloader 只有绝对路径,不能以'/'开始
        
        // http://www.javaworld.com/javaqa/2003-08/01-qa-0808-property.html?page=2

        URI uri = FileTest.class.getResource(relative_Path_4_class).toURI(); // relative_Path
        File file  = new File(uri);
        System.out.printf("==== isExist : %s ====%n", file.exists());
        System.out.printf("==== getPath : %s ====%n", file.getPath());
        System.out.printf("==== getName : %s ====%n", file.getName());
        System.out.printf("==== getCanonicalPath : %s ====%n", file.getCanonicalPath());
        System.out.printf("==== getAbsolutePath : %s ====%n%n", file.getAbsolutePath());
        
        uri = FileTest.class.getResource(absoulte_Path_4_class).toURI();  // absoulte_Path
        file  = new File(uri);
        System.out.printf("==== isExist : %s ====%n", file.exists());
        System.out.printf("==== getPath : %s ====%n", file.getPath());
        System.out.printf("==== getName : %s ====%n", file.getName());
        System.out.printf("==== getCanonicalPath : %s ====%n", file.getCanonicalPath());
        System.out.printf("==== getAbsolutePath : %s ====%n%n", file.getAbsolutePath());
        
        uri = ClassLoader.getSystemResource(absoulte_Path_4_classLoader).toURI();  // absoulte_Path_only_for_classLoader
        // 同样效果
//        uri = FileTest.class.getClassLoader().getResource(absoulte_Path_4_classLoader).toURI();  
//        uri = Thread.currentThread().getContextClassLoader().getResource(absoulte_Path_4_classLoader).toURI();
        file  = new File(uri);
        System.out.printf("==== isExist : %s ====%n", file.exists());
        System.out.printf("==== getPath : %s ====%n", file.getPath());
        System.out.printf("==== getName : %s ====%n", file.getName());
        System.out.printf("==== getCanonicalPath : %s ====%n", file.getCanonicalPath());
        System.out.printf("==== getAbsolutePath : %s ====%n%n", file.getAbsolutePath());
        
        String path = "../resource/b.txt";
        uri = FileTest.class.getResource(path).toURI();  
        file  = new File(uri);
        System.out.printf("==== isExist : %s ====%n", file.exists());
        System.out.printf("==== getPath : %s ====%n", file.getPath());
        System.out.printf("==== getName : %s ====%n", file.getName());
        System.out.printf("==== getCanonicalPath : %s ====%n", file.getCanonicalPath());
        System.out.printf("==== getAbsolutePath : %s ====%n%n", file.getAbsolutePath());
        
        //以下例子只是为了说明 应该使用getCanonicalPath 代替 getAbsolutePath
        //getCanonicalPath能删除冗余的'..' 和 '.' 的字符串
        path = "../resource/b.txt";
        file  = new File(path);
        System.out.printf("==== isExist : %s ====%n", file.exists());
        System.out.printf("==== getPath : %s ====%n", file.getPath());
        System.out.printf("==== getName : %s ====%n", file.getName());
        System.out.printf("==== getCanonicalPath : %s ====%n", file.getCanonicalPath());
        System.out.printf("==== getAbsolutePath : %s ====%n%n", file.getAbsolutePath());
    }

}

 

 

 

Don't judge me