Java中如何按顺序输出配置文件中的内容

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!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值