使用Java读取和解析文本文件
我得到了这个需要解析的文本文件,我正在寻找更有效的方法 文件结构已知,如下所示:使用Java读取和解析文本文件,java,Java,我得到了这个需要解析的文本文件,我正在寻找更有效的方法 文件结构已知,如下所示: [section] key=value key=value [section] key=value [section] key=value 我无法提前知道我将阅读多少[章节],也无法知道每个章节中有多少关键和价值 我正在试图找到将此文件存储在集合中的最佳方式。到目前为止,我认为tu使用的最佳集合应该是Map>,这样每个[section]都会附加相关的键值 我遇到的问题主要是处理空行,因为我正在寻找一个简单的:
[section]
key=value
key=value
[section]
key=value
[section]
key=value
我无法提前知道我将阅读多少[章节],也无法知道每个章节中有多少关键和价值
我正在试图找到将此文件存储在集合中的最佳方式。到目前为止,我认为tu使用的最佳集合应该是Map>,这样每个[section]都会附加相关的键值
我遇到的问题主要是处理空行,因为我正在寻找一个简单的:
if(line.charAt(0) == '[')
显然,对于空行,它返回null
有人能给我介绍一下吗?使用HashMap存储一个部分的键值对。以及一个Hashmap,用于存储具有键值Hashmap的节名。 然后读入第行并检查它是否是带有正则表达式的新节。如果是这样,则为键值对创建一个具有节名和新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]);
}
}
}
例如,您可以将regex与行匹配,以查看其a)新节,b)空白,c)key=value为什么不检查行的长度?如果是
0
,则有一个空行。如果“空”行可以包含空格或制表符,请在检查字符串长度之前不要忘记修剪()字符串。如果您正在读取Java文件,则此操作非常有效。我已经实现了HashMap的HashMap想法,但是在处理章节末尾的空行时遇到了麻烦。
System.out.println(sections.get(SECTIONNAME).get(KEYNAME));