java - Java 中的 BufferedReader 和枚举多行

标签 java bufferedreader enumeration owl ontology

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

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

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

例如,我有以下内容:

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

    // insert code to enumerate list contained in ( )

}

这就是 oneOf 的 .ttl 的样子:

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

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

最佳答案

显然您有某种循环遍历该文件。以下是一些想法:

1) 在循环中引入一个“状态”,以便在读取下一行时知道它实际上位于 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;
    }

}

2) 当遇到 oneOf header 时,创建另一个小循环来读取其值。一个可能的缺点可能是您最终会在文件上进行两个循环迭代并两次调用reader.readLine,这可能会使事情变得复杂,也可能不会。

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

}

3) 上述算法依赖于 header 、( 和第一个值位于同一行等事实。如果源文件已格式化稍有不同,解析将会失败。更灵活的方法可能是使用 StreamTokenizer,它会自动忽略空格并将文本分成单词和独立符号:

StreamTokenizer tokzr=new StreamTokenizer(reader);
tokzr.wordChars(':',':');

while( tokzr.nextToken() != tokzr.TT_EOF ){
    if( tokzr.ttype==tokzr.TT_WORD && tokzr.sval.equals("foo") ){
        ...
    }
    else if ( tokzr.ttype==tokzr.TT_WORD && tokzr.sval.equals("owl:oneOf") ){
        if(tokzr.nextToken()!='(') throw new Exception("\"(\" expected");
        Vector<String> oneOfList = new Vector<String>();
        while(tokzr.nextToken() == tokzr.TT_WORD){
            oneOfList.add(tokzr.sval);
        }
        storeOneOf(oneOfList);
        if(tokzr.ttype!=')') throw new Exception("\")\" expected");
    }
}

关于java - Java 中的 BufferedReader 和枚举多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35224631/

相关文章:

java - 如何让b2box主体和 Sprite 以相同速度旋转?

java - 从 BufferedReader 读取特定持续时间

python-3.x - Networkx:如何在未加权、无向、无标签、连通图中找到最大给定长度的所有唯一路径?

java - JDK 已更新,但以前的版本仍显示为当前版本

java - 如何使用Jfreechart在Eclipse插件 View 中绘制XY折线图

java - 删除文本中的一行;方法不起作用

java - 使用 java 泛型迭代枚举值

scala - 扩展 Scala Enumeration.Val 时如何获得正确的值类型

java - 在运行时更改 Spring bean 实现

java - 使用Java bufferedreader从URL获取html