黑马程序员技术交流社区

标题: 类加载文件问题 [打印本页]

作者: 自己玩    时间: 2012-7-20 22:01
标题: 类加载文件问题
@Test
public void demo4() throws IOException {
String file = ReadFileTest.class.getResource("/4.txt").getFile();
// String file = ReadFileTest.class.getClassLoader().getResource("/4.txt").getFile();
  System.out.println(file);
  BufferedReader reader = new BufferedReader(new FileReader(file));
  String line;
  while ((line = reader.readLine()) != null) {
   System.out.println(line);
  }
}
问题:下面两个代码互换为什么结果 不一样
String file = ReadFileTest.class.getResource("/4.txt").getFile();
// String file = ReadFileTest.class.getClassLoader().getResource("/4.txt").getFile();

作者: 陈欢    时间: 2012-7-20 22:16
不好意思,刚才点错了
作者: 陈欢    时间: 2012-7-20 22:16
不好意思,刚才点错了
作者: 陈欢    时间: 2012-7-20 22:24
本帖最后由 陈欢 于 2012-7-20 22:27 编辑

这两个的区别:

1.FileTest.class.getResource("")

得到的是当前类FileTest.class文件的URI目录。不包括自己!

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/



2.FileTest.class.getClassLoader().getResource("")

得到的也是当前ClassPath的绝对URI路径。

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/


建议:不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。

使用硬编码的绝对路径是完全没有必要的!程序将无法移植!

如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!

当然,我还是推荐你使用程序得到classpath的绝对路径来拼资源的绝对路径
作者: rslheima    时间: 2012-7-20 22:42
一个主要用于相对与一个object取资源,而另一个用于取相对于classpath的资源,用的是绝对路径.
参考资料:http://hi.baidu.com/devilzy_boy/item/6ec8d4f4ec5b16db6325d272
作者: rslheima    时间: 2012-7-20 22:43
一个主要用于相对与一个object取资源,而另一个用于取相对于classpath的资源,用的是绝对路径.
参考资料:http://hi.baidu.com/devilzy_boy/item/6ec8d4f4ec5b16db6325d272
作者: 黑马高明辉    时间: 2012-7-20 22:52
        public void demo4() throws IOException {
                 String file = Test.class.getResource("info.txt").getFile();
//                 String file = Test.class.getResource("/proxy/aopFramework/info.txt").getFile();
//                  String file = Test.class.getClassLoader().getResource("proxy/aopFramework/info.txt").getFile();
                   System.out.println(file);
                   BufferedReader reader = new BufferedReader(new FileReader(file));
                   String line;
                   while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                   }
                 }
这是我试验的代码,
String file = Test.class.getResource("info.txt").getFile();这行的代的写相对路径,它会去找到Test类的包,并且默认info.txt是相对于Test的包而言的,所以会自动去找。
或者写成String file = Test.class.getResource("/proxy/aopFramework/info.txt").getFile();表示绝对路径。
String file = Test.class.getClassLoader().getResource("proxy/aopFramework/info.txt").getFile();这种写发info.txt要和类文件放在同一个目录即classpath目录下。并且不能使用绝对路径。
总之,两者都是调用的classLoader来加载文件的。
作者: 黑马高明辉    时间: 2012-7-23 15:43
找了好久……




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2