黑马程序员技术交流社区

标题: 读取配置文件的问题 [打印本页]

作者: 郭彦君    时间: 2013-4-8 15:09
标题: 读取配置文件的问题
本帖最后由 郭彦君 于 2013-4-8 23:16 编辑

用反射获取配置文件的类名,然后进行操作。代码如下
  1. class ReflectionClass{
  2.         public static void main(String [] args) throws Exception{
  3.                 //创建一个读取流,关联配置文件.注意:在实际开发中一般不会用相对路径来获取配置文件。
  4.                 InputStream is = new FileInputStream("config.properties");

  5.                 //为了验证是否关联成功,将数据读到缓冲区,并打印。
  6.                 byte [] buf = new byte[1024];
  7.                 int len = is.read(buf);
  8.                 for (int i=0; i<len; i++) {
  9.     System.out.print(buf[i]);                        
  10.                 }
  11.                 //创建properties对象
  12.                 Properties p = new Properties();
  13.                 //加载文件中的内容
  14.                 p.load(is);
  15.                 is.close();
  16.                 //获取配置信息中键值对的值,得到类名
  17.                 String className = p.getProperty("className");
  18.                 //创建该类的对象
  19.                 Collection collections = (Collection) Class.forName("className").newInstance();
  20.                 collections.add("abc");
  21.                 collections.add("bbc");
  22.                 collections.add("abc");
  23.                 System.out.println(collections.size());
  24.         }
  25. }
复制代码
发现两个问题
1、我将配置文件放到和这个类相同的目录下,用相对路径就会出现无法找到文件异常,只能用绝对路径,为什么视频中就可以用相对路径
     配置文件内容:className=java.util.ArrayList
     异常信息:Exception in thread "main" java.io.FileNotFoundException: config.properties (系统找不到指定的文件。)                     at java.io.FileInputStream.open(Native Method)
                     at java.io.FileInputStream.<init>(Unknown Source)
                     at java.io.FileInputStream.<init>(Unknown Source)
                     at lann.Day2.ReflectionClass.main(ReflectionClass.java:246)//行号不一样,因为我文件中的还有其他代码,复制的不全。
2、如果我改成绝对路径后,配置信息可以读取到,但是又出现下面的异常
       Exception in thread "main" java.lang.ClassNotFoundException: className
       这又是为什么?
搞的头都大了,大神们帮忙看看,谢了

作者: 黑马李超    时间: 2013-4-8 15:18
1.视频中使用相对路径是因为使用的是ClassLoader类的对象的getResourceAsStream方法,通过io流来操作文件应该根据classpath来指定对应的路径
默认的classpath应该是工程的根目录。
2.流资源应该在获取到className后才可以关闭吧
作者: 郭彦君    时间: 2013-4-8 15:28
黑马李超 发表于 2013-4-8 15:18
1.视频中使用相对路径是因为使用的是ClassLoader类的对象的getResourceAsStream方法,通过io流来操作文件应 ...

用另一种也试过
InputStream is = ReflectionClass.class.getClassLoader().getResourceAsStream("config.properties");
但是又出现异常了
Exception in thread "main" java.lang.NullPointerException
用这个方法连配置信息都读不出来了。

还有关闭流资源可以加载完就关了,因为已经加载到内存了
作者: 黑马李超    时间: 2013-4-8 15:34
Collection collections = (Collection) Class.forName("className").newInstance();//这个className是String类 不需要加引号吧
作者: 谭辉    时间: 2013-4-8 15:45
如果该程序是放在以java.开头的包内,请更换包名...

作者: 郭彦君    时间: 2013-4-8 15:50
黑马李超 发表于 2013-4-8 15:34
Collection collections = (Collection) Class.forName("className").newInstance();//这个className是Str ...

哦哦,晕了,确实这里错了:L
这个把className的异常解决了。谢谢大神
但是第一个问题没解决掉,还是不能用相对路径,不知道怎么回事

作者: 郭彦君    时间: 2013-4-8 15:52
谭辉 发表于 2013-4-8 15:45
如果该程序是放在以java.开头的包内,请更换包名...

没有,是放到自己命名的包里




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