2012-01-14 86 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