一、非顺序加载 (Properties加载方式)
-
新建普通java工程如下
-
创建resource目录
-
创建两份info文件,一份为properites,一份为txt, 文件内容如下
-
整个工程目录如下
- 遍历方式1(通过集合Set方式)
public void showInfoByUtilSet() {
InputStream stream = Loading.class.getResourceAsStream("/info.properties");
try {
Properties prop = new Properties();
prop.load(stream);
Set<Object> keySet =prop.keySet();
for(Object b : keySet) {
String key = (String) b;
String value = prop.getProperty(key);
System.out.println("key ="+key+" value="+value);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
``
- 遍历方式2(通过集合Enum方式)
public void showInfoByUtilEnum() {
InputStream stream = Loading.class.getResourceAsStream("/info.properties");
try {
Properties prop = new Properties();
prop.load(stream);
Enumeration<Object> keyEnum = prop.keys();
while(keyEnum.hasMoreElements()) {
String key = (String)keyEnum.nextElement();
String value = prop.getProperty(key);
System.out.println("key ="+key+" value="+value);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- 两种方式输出结果:
注意 :
1 两份属性文件的文件夹resource目录必须引入构建路径(build path)。
2 加载文件的时候需要“/info.properties”,“/”表示从根目录开始寻找名字为info且后缀为properties的文件。
通过对比属性文件和输出结果我们可以看到,输出并不是按照输入的顺序来的,这是因为util 下的properties类 extends HashTable,HashTable是无序的。
二、顺序加载 (IO流读入方式)
- 示例代码
public class Loading1 {
public static void main(String[] args){
InputStream inputStream = Loading1.class.getResourceAsStream("/info.txt");
InputStreamReader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
String line = null;
try {
while( (line = bufferedReader.readLine()) != null) {
StringTokenizer tokenizer = new StringTokenizer(line, "="); //以等号分割字符串
String key = null;
String value = null;
if(line.trim().indexOf('#') == 0) { // 跳过以#开头的注解行
continue;
}
while(tokenizer.hasMoreElements()) {
key = tokenizer.nextToken(); //等号前的为key
value = tokenizer.nextToken(); //等号后的为value
}
System.out.println("key =" + key +" value="+ value);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- 输出结果
- 对比输入输出结果,采用IO流方式的时候输入输出是有序的,一行一行的读入。
- 两种方式比较:
实际项目中以properties加载的居多,因为properties内部是以hashTable方式实现的,这种方式有个好处就是他是线程安全的。内部数据结构采用红黑树,查找和删除的效率更高。
三、总结
- Properties内部实现为HashTable, 存取为无序。
- HashTable线程安全,Properties和IO读取,优先选择properties读取。