2015-12-09 50 views
0

我得到了需要解析的文本文件,我正在寻找更有效的方法来完成它。使用Java阅读和解析文本文件

文件结构是已知的,看起来像这样:

[section] 
key=value 
key=value 

[section] 
key=value 

[section] 
key=value 

我有没有办法事先知道有多少[第]我会读,也没有多少关键&值出现在每个部分。

我正试图找到将此文件存储在集合中的最佳方法。到目前为止,我认为最好的集合tu的使用将是一个Map>,这样每个[section]都会有相关的键值。

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

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

,显然,对于空白行则返回null。

任何人都可以让我知道吗?

+1

值你可以例如正则表达式匹配线路,看看它一)新的部分,B)空白, c)key =值 – Jan

+6

为什么不检查线的长度?如果它是'0',你有一个空行。 – gonzo

+3

如果'空'行可以包含空格或制表符,请不要忘记修剪()您的字符串 – StephaneM

回答

0

使用HashMap存储一个节的键值对。还有一个Hashmap用于存储节名称和Key Value哈希图。 然后阅读并检查它是否是一个新的正则表达式部分。如果是这样,则为Key Value对创建一个具有Name和New HashMap的新条目。如果不是通过“=”标记分割行,并将实际的部分hashmap放入新的键值对。如果没有找到正则表达式,并且分割不会导致两个部分,那么它既不是新节,也不是Key Value,并且该行将被解散。

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]); 
     }      
    } 
} 

之后,你已经存储在部分所需的变量,你可以得到所需的与

System.out.println(sections.get(SECTIONNAME).get(KEYNAME)); 
+0

工程就像一个魅力。我已经得到了HashMap的HashMap思想,但在处理段落末尾的空行时遇到了麻烦。 – aur8l