【背景】
系统快要上线,安排客户帮我们核对系统资源文件的中英文对照翻译,直接把一堆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();
}
}
相关参考: