2012-01-14 73 views
0

我有這樣的代碼:如何讓String Tokenizer忽略文本?

public void readTroops() { 
     File file = new File("resources/objects/troops.txt"); 
    StringBuffer contents = new StringBuffer(); 
    BufferedReader reader = null; 

    try { 
     reader = new BufferedReader(new FileReader(file)); 
     String text = null; 

     // repeat until all lines is read 
     while ((text = reader.readLine()) != null) { 
      StringTokenizer troops = new StringTokenizer(text,"="); 
      String list = troops.nextToken(); 
      String value = troops.nextToken(); 
} 

並且此文件:

//this is a comment part of the text file// 

Total=1 

的問題是:1)我不能讓它忽略一切內// //並不能獲得它在它們之間用「ENTER」(行)讀取。例如,這段文字的工作原理如下:

Total=1 

所以我的問題是我怎麼輸入到分隔符區域即。

StringTokenizer troops = new StringTokenizer(text,"=","WHAT GOES HERE?"); 

那麼,怎樣才能我得到標記生成器忽略「ENTER」鍵/新的生產線,以及任何在兩者之間//或類似的東西,謝謝。

ps.我不在乎你是否使用String.split來回答我的問題。

+0

你解析性文件(也許評論name = value對?) – milan 2012-01-14 09:27:37

+0

它的一個txt文件,而不是屬性文件(屬性文件是文件類型?),而不是rtf或rtfd ... – Russell 2012-01-14 09:29:10

+0

是,txt文件,名稱=值行和可選註釋? – milan 2012-01-14 09:30:47

回答

2

使用方法countTokens跳過線不具有兩個標記:

while ((text = reader.readLine()) != null) { 
     StringTokenizer troops = new StringTokenizer(text,"="); 
     if(troops.countTokens() == 2){ 
      String list = troops.nextToken(); 
      String value = troops.nextToken(); 
      .... 
     }else { 
      //ignore this line 
     } 
} 
+0

謝謝謝謝謝謝謝謝謝謝謝謝!!!!! – Russell 2012-01-14 10:07:56

1
Properties prop = new Properties(); 
prop.load(new FileInputStream("properties_file.txt")); 
assertExuals("1",prop.getProperty("Total")); 

ps。您可能會持有並關閉輸入流。

1

開箱思考,也許你可以使用Properties而不是分詞器(如果你更新你的評論以#開頭)?

Properties troops = new Properties(); 
InputStream inputStream = SomeClass.class.getResourceAsStream("troops.properties"); 
try { 
    props.load(inputStream); 
} catch (IOException e) { 
    // Handle error 
} finally { 
    // Close inputStream in a safe manner 
} 
troops.getProperty("Total"); // Returns "1" 

或者,如果你使用的是Java 7:

Properties troops = new Properties(); 
try (InputStream inputStream = SomeClass.class.getResourceAsStream("troops.properties")) { 
    props.load(inputStream); 
} catch (IOException e) { 
    // Handle error 
} 
troops.getProperty("Total"); // Returns "1" 
0

如果您在閱讀文件更好的方法是使用StreamTokenizer。這就允許你聲明你自己的tokenizer的語法。我使用這種方法來創建一個HTML渲染引擎。然後,您可以直接從閱讀器進行解析,還可以提供有用的功能來識別數字,您似乎可以使用這些數字。 (我將發佈一次,我的日食負荷的例子!)

public static String render(String file, HashMap vars){ 

    // Create a stringbuffer to rebuild the string 
    StringBuffer renderedFile = new StringBuffer(); 
    try{ 
    FileReader in = new FileReader(file); 
    BufferedReader reader = new BufferedReader(in); // create your reader 
    StreamTokenizer tok; 
     tok = new StreamTokenizer(reader); //the tokenizer then takes in the reader as a builder 
     tok.resetSyntax(); 
     tok.wordChars(0, 255); //sets all chars (inc spaces to be counted as words) 
     /* 
     * quoteChar allows you to set your comment char, for example $ hello $ means it will ignore hello 
     */ 
     tok.quoteChar('$'); 

    while(tok.nextToken()!=StreamTokenizer.TT_EOF){ //while it is not at the end of file 
    String s = tok.sval; 
    if (vars.containsKey(s)) 
     s =(String)vars.get(s); 
    renderedFile.append(s); 
    } 

    } 
    catch(Exception e){System.out.println("Error Loading Template");} 

    return renderedFile.toString(); 

} 

檢查了這一點的一個很好的教程http://tutorials.jenkov.com/java-io/streamtokenizer.html