BufferedReader并枚举Java中的多行

时间:2016-02-05 12:46:20

标签: java bufferedreader enumeration owl ontology

我正在制作一个逐行读取.ttl文件的java应用程序,并创建一个graphml文件来表示本体。

我在弄清楚如何枚举某个部分时遇到了一些麻烦。

我正在使用BufferedReader来阅读每一行。

例如,我有以下内容:

else if (line.contains("owl:oneOf")){

    // insert code to enumerate list contained in ( )

}

这就是.ttl对oneOf来说的样子:

    owl:oneOf  (GUIFlow:ExactlyOne
                GUIFlow:OneOrMore
                GUIFlow:ZeroOrMore
                GUIFlow:ZeroOrOne ) 

我需要将这4个对象作为一个列表返回,以用作本体的图形表示的一部分。

2 个答案:

答案 0 :(得分:1)

显然你有一些循环遍历文件。以下是一些想法:

1)介绍"州"进入循环,以便在读取下一行时,它将知道它实际上在oneOf列表中。存储列表的动态数组可以作为状态。您在遇到(时创建列表,并在遇到)时将列表发送到需要的位置,然后在此之后删除列表。一个复杂的问题是,根据您的源格式,您必须在向其添加值之前创建列表,并在添加值之后处理并删除列表,因为{{1 }}和(与实际值位于同一行。

)

2)遇到oneOf标头时,创建另一个小循环以读取其值。一个可能的缺点可能是你最终有两个循环迭代文件和两个调用Vector<String> oneOfList = null; while(reader.ready()){ String line=reader.readLine(); if(line.contains("foo")){ ... } else if (line.contains("owl:oneOf")){ oneOfList = new Vector<String>(); } if(oneOfList!=null){ String str = line.trim(); int a = str.indexOf("("); // -1 if not found, OK int b = str.indexOf(")"); if(b<0) b=str.length(); oneOfList.add(str.substring(a+1,b).trim()); } if (line.contains(")")){ storeOneOf(oneOfList); oneOfList=null; } } ,这可能使事情变得复杂或可能不复杂。

reader.readLine

3)以上算法依赖于标题,while(reader.ready()){ String line=reader.readLine(); if(line.contains("foo")){ ... } else if (line.contains("owl:oneOf")){ Vector<String> oneOfList = new Vector<String>(); while(true){ String str = line.trim(); int a = str.indexOf("("); // -1 if not found, OK int b = str.indexOf(")"); int c = (b>=0) ? b : str.length(); oneOfList.add(str.substring(a+1,c).trim()); if(b>=0) break; line=reader.readLine(); } storeOneOf(oneOfList); } } 和第一个值在同一行等等这一事实。如果源文件的格式有点不同,解析将失败。更灵活的方法可能是使用(自动忽略空格并将文本分为单词和独立符号:

StreamTokenizer

答案 1 :(得分:1)

您是否考虑(并拒绝)现有解决方案,例如:Jena