簡體   English   中英

BufferedReader並枚舉Java中的多行

[英]BufferedReader and enumerating multiple lines in Java

我正在制作一個Java應用程序,它.ttl讀取.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標頭時,創建另一個小循環以讀取其值。 可能的缺點是,您最終會在文件上循環兩個循環,並兩次調用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)以上算法依賴於標頭, (和第一個值在同一行等),如果源文件的格式有些不同,則解析將失敗,一種更靈活的方法是使用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");
    }
}

您是否考慮過(並拒絕過)現有解決方案,例如: Jena

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM