自从转投Java阵营后,一直发下Java程序的路径读取异常麻烦,因此查阅了比较多的版本内容,整合了一份自己的学习笔记。主要使用Class及通过ClassLoader来动态获取文件路径。
查阅链接如下: Class及ClassLoader下获取Resource原理
Class及ClassLoader下获取Resource图文解析
首先,在IDE下面写的.java文件最终会被编译成一个.class的类。上面两种方法去读取文件都是基于.class的相对路径进行索引。
通过Class和ClassLoader两个类下的Resource方法获取路径主要区别是参数是否以"/"开头。
1. 通过Class.getResource方法获取文件路径
△getResource方法
(1) getResource方法必须输入参数,该方法没有提供空参数的方法重载,因此该方法必须输入参数。
(2) Class.getResource("")与Class.getResource("/") 的主要区别:空字符串下对应返回class文件所在包的位置,"/"参数返回的是class文件所在的根目录(所在包的上级目录)
2. 通过ClassLoader.getResource方法获取文件路径
ClassLoader.getResource方法同样带有一个String 类型的目录参数,但ClassLoader.getResource方法参数不支持参数为"/",因为该实例方法返回的就是类所在的根目录路径。输入带"/"开头的字符串,会返回null。
3. 示例以JDBCHelper类,分别获取1.xml,2.xml 及dbcfg.properties文件
文件分布如图所示:
1 @Test 2 public void testFilePath() throws Exception 3 { 4 // 以class.getResource方法获取文件路径 5 System.out.println("------getFileURL by class.getResource------"); 6 URL fileURL = JDBCHelper.class.getResource("1.xml"); 7 System.out.println("1.xml Exit? " + isfileExit(fileURL)); 8 9 fileURL = JDBCHelper.class.getResource("/2.xml"); 10 System.out.println("2.xml Exit? " + isfileExit(fileURL)); 11 12 fileURL = JDBCHelper.class.getResource("/config/dbcfg.properties"); 13 System.out.println("properties Exit? " + isfileExit(fileURL)); 14 System.out.println("------getFileURL by classLoader.getResource------"); 15 16 fileURL = JDBCHelper.class.getClassLoader().getResource("com/scl/test/transcaction/1.xml"); 17 System.out.println("1.xml Exit? " + isfileExit(fileURL)); 18 19 fileURL = JDBCHelper.class.getClassLoader().getResource("2.xml"); 20 System.out.println("2.xml Exit? " + isfileExit(fileURL)); 21 22 fileURL = JDBCHelper.class.getClassLoader().getResource("config/dbcfg.properties"); 23 System.out.println("properties Exit? " + isfileExit(fileURL)); 24 25 } 26 27 public boolean isfileExit(URL fileURL) throws Exception 28 { 29 if (fileURL == null) { return false; } 30 String URLStr = URLDecoder.decode(fileURL.getFile(), "utf8"); 31 File f = new File(URLStr); 32 if (f != null && f.exists()) 33 { 34 f = null; 35 return true; 36 } 37 else 38 { 39 return false; 40 } 41 42 }
结果如下: