017 配置文件的知识
刚刚已经说到 配置文件,我说放 工程下,和src 兄弟
这时的目录结构是
D:\enhance
│ .project
│ .classpath
│ ★config.properties
│
├─src
│ └─com
│ └─ncs
│ Enum.java
│ Weekday.java
│ EnumDemo.java
│ EnumWithAbstractMethod.java
│ ReflectTest.java
│ Point.java
│ HasMainMethod.java
│ RunOtherClassMainMethod.java
│ ArrayReflct.java
│ ReflectInCollection.java
│ MyHashTest.java
│ ReadProperties.java
│
└─bin
└─com
└─ncs
Enum.class
Weekday.class
Weekday$1.class
Weekday$2.class
EnumDemo.class
EnumDemo$Month.class
EnumWithAbstractMethod.class
EnumWithAbstractMethod$TrafficLights.class
EnumWithAbstractMethod$TrafficLights$3.class
EnumWithAbstractMethod$TrafficLights$1.class
EnumWithAbstractMethod$TrafficLights$2.class
ReflectTest.class
Point.class
HasMainMethod.class
RunOtherClassMainMethod.class
ArrayReflct.class
ReflectInCollection.class
MyHashTest.class
ReadProperties.class
我开发好了后,不可能把enhance整个目录给 客户,最多把bin目录打包给人家
★那么把配置文件放哪里呢???????????
我刚刚前一篇这样说过:
------------------
//介绍反射的好处
//比方说我不写死,写一个 米你 框架,接受用户在配置文件里写的类
//配置文件写在 工程目录底下,不是src下 和src兄弟级
public static void main(String[] args) throws Exception {
//load properties file
InputStream is = new FileInputStream("config.properties");
------------------
★其实不会这么做的
来看一下
C:\Documents and Settings\hubin>java MyClass xx.file
这里的xx.file 既不关系你的JAVA.EXE 也不关系你的MyClass这个类在哪里
而是和C:\Documents and Settings\hubin有关
然而你也可以到D盘去运行MyClass
这时又要在D盘下准备xx.file,显然不可行
如果写死
InputStream is = new FileInputStream("D:\\config.properties");
也不对的.
怎么办?????????
1,可以写一个 配置文件,告诉JVM,我把配置文件放哪里了,就是描述配置文件在哪里的配置文件
2,用类加载器
我们平时用的*.class文件怎么进JVM的呢???
既然 类加载器 可以把*.class文件从disk上加到JVM里
那么 加载 个配置文件也是顺手之劳了
具体看代码吧::
-----------------------------------------------
package com.ncs;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;
public class ReadProperties {
//介绍配置文件放哪里了
public static void main(String[] args) throws Exception {
//要run这个APP,ReadProperties肯定要进JVM吧
//可以从这个类开刀,找到类加载器,然后 类加载器 在classpath下 一个个去找
InputStream is =ReadProperties.class.getClassLoader().getResourceAsStream("com/ncs/config.properties");
//注意没有 / 打头
//现在好了,只是这方式不可以写,只读的,
//很多很多的框架的配置文件都用这种方式的,所以都不啊配置文件放classpath下的
//可以在ECLIPSE的src下放一个,IDE会自己给你创建一个在 bin下,最里面,写名字要写包名com/ncs/config.properties
//不要自己去放,会被ECLIPSE删掉的,要在IDE里放
InputStream is2 = ReadProperties.class.getResourceAsStream("config.properties");
//上面这行就更简单了,包名也可以不要了,ReadProperties 和 config.properties同名
//也可以加 / 加了就是说从 根开始找 一层一层包名要写全了
//把配置文件放中间会怎么样呢?
//好象没有中间,都放src下,也就是直接在src下一层就有了[我的程序]
Properties properties = new Properties();
properties.load(is);
is.close();
String className = properties.getProperty("className");//良好的命名习惯
//Collection collection = new ArrayList(); 现在不用写死了
Collection collection = (Collection)Class.forName(className).newInstance();
String test = "hubin";
collection.add(test);
collection.add(test);
collection.add(test);
System.out.println(collection.size()); //3 因为在培植文件里是ArrayList
//System.out.println(collection.size()); //1 因为在培植文件里是java.util.HashSet
}
}
-----------------------------------------------------