Java中总是有一些配置文件来读取,一般都是通过键来访问某个值,但是一般的读取方式总是不能按顺序读取。想按顺序读取,到网上了查了好多都没找到,偶尔发现几个却不好使,郁闷啊。Baidu,Google靠不住,只能靠自己了。
1、配置文件如下【PropData.txt】:
#
# 说明:项目配置文件
# 时间:XXXX年XX月XX日
#
#
# 网络配置
#
[NetConfig]
ip=127.0.0.1
port=8000
#
# 消息配置
#
[MessageConfig]
FileNotFind=File Not Find!
NameError=Username is Error!
PasswordError=Password is Error!
NameNotFind=This name don't find!
#
#用户配置
#
[UserConfig]
NewsUser=0
ForumUser=1
AdminUser=99
2、一般的读取方式:
package properties;
import java.io.FileInputStream;
public class TestPropertiesOne {
public static void main(String[] args) {
try {
Properties pro = new Properties();
FileInputStream fis = new FileInputStream("PropData.txt");
pro.load(fis);
// 遍历输出得键、值
Enumeration en = pro.propertyNames();
while (en.hasMoreElements()) {
// 获得键
String propKey = (String) en.nextElement();
// 获得值
String propElm = pro.getProperty(propKey);
// 输出键和值
System.out.println(propKey + ": " + propElm);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果如下,发现并不是按书写的顺序输出的:
port: 8000
ForumUser: 1
[NetConfig]:
AdminUser: 99
ip: 127.0.0.1
FileNotFind: File Not Find!
NameNotFind: This name don't find!
NameError: Username is Error!
[MessageConfig]:
PasswordError: Password is Error!
[UserConfig]:
NewsUser: 0
3、我新建立一个类,实现按顺序读取。
package properties;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Enumeration;
class OrderProperties {
private ArrayList<String> keyList = new ArrayList<>();; // 存放键
private ArrayList<String> valList = new ArrayList<>();; // 存放值
private int count = 0;
Enumeration propertyNames;
OrderEnumerator orderEnume;
public OrderProperties() {
}
public void load(FileInputStream fis) {
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
setKeyValue(br);
}
private void setKeyValue(BufferedReader br) {
String row;
try {
while ((row = br.readLine()) != null) {
// 跳过空行
if (row.length() == 0)
continue;
// 跳过注释
if (row.charAt(0) == '#')
continue;
//
String nv[] = row.split("=");
if (nv.length > 1) {
keyList.add(nv[0]);
valList.add(nv[1]);
} else {
keyList.add(nv[0]);
valList.add("");
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 实现 Enumeration 接口的对象
Enumeration propertyNames() {
orderEnume = new OrderEnumerator(count, keyList, valList);
return orderEnume;
}
/**
* 通过键找到值
*
* @param key
* @return
*/
public String getProperty(String key) {
int index = keyList.indexOf(key);
if (index > -1) {
return valList.get(index);
}
return "";
}
class OrderEnumerator implements Enumeration {
private ArrayList<String> keyList; // 存放键
private ArrayList<String> valList; // 存放值
private int count; // 计数器
public OrderEnumerator(int count, ArrayList<String> keyList, ArrayList<String> valList) {
this.count = count;
this.keyList = keyList;
this.valList = valList;
}
/**
* 是否还有下一个元素
*/
@Override
public boolean hasMoreElements() {
// System.out.println(count + "," + keyList.size());
return count < keyList.size();
}
/**
* 返回下个元素的值
*/
@Override
public Object nextElement() {
return keyList.get(count++);
}
}
}
4、调用方式:
package properties;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
public class TestPropertiesTwo {
public static void main(String[] args) {
try {
OrderProperties pro = new OrderProperties();
FileInputStream fis = new FileInputStream("PropData.txt");
pro.load(fis);
// 遍历输出得键、值
Enumeration en = pro.propertyNames();
while (en.hasMoreElements()) {
// 获得键
String propKey = (String) en.nextElement();
// 获得值
String propElm = pro.getProperty(propKey);
// 输出键和值
System.out.println(propKey + ": " + propElm);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果如下:
[NetConfig]:
ip: 127.0.0.1
port: 8000
[MessageConfig]:
FileNotFind: File Not Find!
NameError: Username is Error!
PasswordError: Password is Error!
NameNotFind: This name don't find!
[UserConfig]:
NewsUser: 0
ForumUser: 1
AdminUser: 99
5、其实最后才是我想要的,我想输出指定Section比如[MessageConfig]的内容,调用方式如下:
package properties;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
public class TestPropertiesThree {
public static void main(String[] args) {
getSectionData("[MessageConfig]");
}
public static void getSectionData(String sectionName) {
boolean add = false;
try {
OrderProperties pro = new OrderProperties();
FileInputStream fis = new FileInputStream("PropData.txt");
pro.load(fis);
// 遍历输出得键、值
Enumeration en = pro.propertyNames();
while (en.hasMoreElements()) {
// 获得键
String propKey = (String) en.nextElement();
// 输出指定section下的配置
if (propKey.equals(sectionName)) {
add = true;
continue;
}else if(propKey.contains("[")){
add = false;
}
if (add == true) {
// 获得值
String propElm = pro.getProperty(propKey);
// 输出键和值
System.out.println(propKey + ": " + propElm);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果:
FileNotFind: File Not Find!
NameError: Username is Error!
PasswordError: Password is Error!
NameNotFind: This name don't find!
6、实际开发用的时候,肯定是指定一个Section然后,在指定的Section中根据指定的键获得相应的值。
package properties;
import java.io.FileInputStream;
public class TestPropertiesFour {
public static void main(String[] args) {
HashMap<String, String> hm=getSectionData("[MessageConfig]");
System.out.println(hm.get("FileNotFind"));
}
public static HashMap<String, String> getSectionData(String sectionName) {
HashMap<String, String> hm=new HashMap<String, String>();
boolean add = false;
String propKey=null;
try {
OrderProperties pro = new OrderProperties();
FileInputStream fis = new FileInputStream("PropData.txt");
pro.load(fis);
// 遍历输出得键、值
Enumeration<?> en = pro.propertyNames();
while (en.hasMoreElements()) {
// 获得键
propKey = (String) en.nextElement();
// 输出指定section下的配置
if (propKey.equals(sectionName)) {
add = true;
continue;
}else if(propKey.contains("[")){
add = false;
}
if (add == true) {
hm.put(propKey, pro.getProperty(propKey));
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return hm;
}
}
输出结果:
File Not Find!