我得到了这个需要解析的文本文件,我正在寻找更有效的方法。
文件结构已知,如下所示:
[section]
key=value
key=value
[section]
key=value
[section]
key=value
我无法事先知道我会阅读多少[部分],也不知道有多少关键&每个部分都有价值。
我正在尝试找到将此文件存储在集合中的最佳方法。到目前为止,我认为最好的集合使用将是一个Map>,因此每个[section]都会附加其关联的键值。
我遇到的问题主要是处理空行,因为我正在寻找一个简单的新部分:
if(line.charAt(0) == '[')
显然,使用空行会返回null。
任何人都可以让我对此提出异议吗?
答案 0 :(得分:0)
使用HashMap存储一个部分的键值对。以及使用键值Hashmap存储节名称的Hashmap。 然后读入并检查它是否是带有正则表达式的新部分。如果是,则创建一个带有Name部分的新条目和Key Value对的新HashMap。如果没有按“=”标记拆分行,则将新的键值对放入实际的部分hashmap中。如果没有找到正则表达式并且拆分不会导致两个部分,则它既不是新部分也不是键值,并且该行将被解除。
HashMap<String,HashMap<String,String>> sections = new HashMap<>();
BufferedReader br = new BufferedReader(new FileReader(new File(filename)));
String line = "";
HashMap<String,String> actualSection = null;
Pattern p = Pattern.compile("\\[(.*?)\\]"); // regex pattern for brackets
while ((line = br.readLine()) != null) {
Matcher m = p.matcher(line);
if(m.find()){
// found regex means new section
actualSection = new HashMap<String,String>();
sections.put(m.group(1), actualSection);
} else{
// read in new key Value pairs
String[] parts = line.split("=");
if(parts.length == 2 && actualSection != null){
actualSection.put(parts[0],parts[1]);
}
}
}
之后,您将所有内容存储在sections变量中,您可以使用
获得所需的值System.out.println(sections.get(SECTIONNAME).get(KEYNAME));