使用Java

时间:2015-12-09 15:20:22

标签: java

我得到了这个需要解析的文本文件,我正在寻找更有效的方法。

文件结构已知,如下所示:

[section]
key=value
key=value

[section]
key=value

[section]
key=value

我无法事先知道我会阅读多少[部分],也不知道有多少关键&每个部分都有价值。

我正在尝试找到将此文件存储在集合中的最佳方法。到目前为止,我认为最好的集合使用将是一个Map>,因此每个[section]都会附加其关联的键值。

我遇到的问题主要是处理空行,因为我正在寻找一个简单的新部分:

if(line.charAt(0) == '[')

显然,使用空行会返回null。

任何人都可以让我对此提出异议吗?

1 个答案:

答案 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));