как вы получаете String Tokenizer игнорировать текст? - PullRequest
0 голосов
/ 14 января 2012

У меня есть этот код:

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?");

Так как я могу заставить Tokenizer игнорировать 'ENTER' / новую строку и все, что между // или что-то подобное, спасибо.

ps. Мне все равно, используете ли вы String.split для ответа на мой вопрос.

Ответы [ 4 ]

2 голосов
/ 14 января 2012

Используйте метод 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
        }
} 
1 голос
/ 14 января 2012

Думая из коробки, может быть, вы можете использовать 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"
1 голос
/ 14 января 2012
Properties prop = new Properties();
prop.load(new FileInputStream("properties_file.txt"));
assertExuals("1",prop.getProperty("Total"));

пс.Вы можете удерживать и закрывать поток ввода.

0 голосов
/ 14 января 2012

Если вы читаете файл, лучше использовать StreamTokenizer .Это тогда позволяет вам объявить свой собственный синтаксис токенизатора.Я использовал этот метод для создания движка рендеринга 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

...