Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java读取和解析文本文件_Java - Fatal编程技术网

使用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));