Question

I have this code:

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

and this file:

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

Total=1

the problem is that 1) I cant get it to ignore everything within the //,// and can't get it to read with an 'ENTER' (line) in-between them. For example, this text works:

Total=1

So my question is what do I type into the delimiter area ie.

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

So how can I get Tokenizer to ignore 'ENTER'/new line, and anything in-between // or something similar, thanks.

ps.I don't care if you use a String.split to answer my question.

Was it helpful?

Solution

Use the method countTokens to skip lines that don't have two tokens:

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

OTHER TIPS

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

ps. you might hold and close input stream.

Thinking out of the box, maybe you can use Properties instead of tokenizer (if you update your comments to start with #)?

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"

Or if you are using 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"

If you are reading in the file a better way would be to use a StreamTokenizer. This then allows you to declare your own syntax of the tokenizer. I used this method to create a HTML rendering engine. This then allows you to parse direct from a reader, and also provides useful functions to identify numbers, which it seems you may use. (I will post an example once my eclipse loads!)

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

}

Check this out for a good tutorial http://tutorials.jenkov.com/java-io/streamtokenizer.html

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top