NO.64 保持原Properties文件中排序(注释、空行也包含)的OrderedProperties类

    【背景】

    系统快要上线,安排客户帮我们核对系统资源文件的中英文对照翻译,直接把一堆Properties文件扔给客户后直接一个电话打过来:“你让我们怎么看啊?”嗯,这事儿办得确实没走脑子(吼吼,借用女儿儿童小故事里丢了蛋的小鸭子的一句台词:“不是我不动脑子,是我脑子有毛病……^^”——最近一个人要搞定“系统基础代码准备”、“数据迁移”,还要准备PMP,累得脑子都基本不咋转了……啊呀,一把辛酸泪)

    想前想后,决定将各Properties文件转换为一个Excel:一列Key,一列中文名,一列英文名,再将各模块的Properties文件内容写至不同Sheet页中。

     OK,想好方案,开始编码…敲完啦,输出Excel之后发现两个问题:

     1.Java的Properties默认按ISO-8859-1来读取文件,Excel里的中文全都乱码了;

     2.Properties extends Map,输出时按Keys来的,全都乱序了……看着那个乱啊(原来相邻的都是业务相关的)

 

     那有没有不打乱顺序的Properties加载类呢,上网搜了一下,果然有,稍加改造(1.将IO部分改造为使用IOUtils;2.将释行、空行做为Key也塞进Map里去),完整代码如下,供大家参考^^

package amosryan.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 
 * @author amosryan
 * @since 2011-06-17
 */
public class OrderedProperties {

	/** Keys*/
	private List<String> keys = new ArrayList<String>();

	/** ValueMap*/
	private Map<String, String> valueMap = new HashMap<String, String>();

	public String getProperty(String key) {
		return valueMap.get(key);
	}

	public List<String> getKeys(String keyPattern) {
		Pattern pat = Pattern.compile(keyPattern);
		List<String> kl = new ArrayList<String>();
		for (String k : keys) {
			if (pat.matcher(k).matches()) {
				kl.add(k);
			}
		}
		return kl;
	}

	/**
	 * 加载Properties文件
	 * @param istream
	 * @throws Exception
	 * @see amosryan.util.IOUtils
	 */
	public synchronized void load(InputStream istream) throws Exception {
		List<String> lines = IOUtils.toLines(istream);
		
		// parse key-value
		for (String l : lines) {
			if (l.trim().startsWith("#")) {
				keys.add(l);
			} else {
				if (l.indexOf("=") > -1) {
					String k = l.substring(0, l.indexOf("=")).trim();
					String v = l.substring(l.indexOf("=") + 1).trim();
					keys.add(k);
					valueMap.put(k, v);
				} else {
					keys.add(l);
				}
			}
		}
	}

	public List<String> getKeys() {
		return keys;
	}

	@Override
	public String toString() {
		return valueMap.toString();
	}

}

相关参考:

NO.63 IO常用工具类(读文件、写文件、打Zip包)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值