StringTokenizer не создает токены с новыми строками

У меня возникли проблемы с тем, чтобы StringTokenizer разбил несколько строк текста на отдельные токены. Введенный текст

3
monkeys

Но StringTokenizer, по-видимому, интерпретирует это как «3monkeys». Мне нужно, чтобы это было "3" и "обезьяны". Из-за этого генерируется исключение NumberFormatException, так как мне нужно преобразовать строку «3» в целое число.

Это код, который у меня есть до сих пор.

    Scanner f = new Scanner( new FileInputStream("input.txt" )); // Yes, i have the actual input file path here, but I changed it for this question.
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("output.txt")));

    String temp = "";
    //String cString = "";

    while( f.hasNextLine() ) {
        String cString = f.nextLine();
        temp += cString;
    }
    StringTokenizer everythingTokens = new StringTokenizer( temp );
    String[] everything = new String[ everythingTokens.countTokens() ];

    for( int i = 0; i < everything.length; i++ ) {
        everything[ i ] = everythingTokens.nextToken();
    }

    int numberOfPeople = Integer.parseInt( everything[ 0 ] ); // Line where exception occurs.
    out.println( everything[ 0 ] );

Сообщение об ошибке это

Exception in thread "main" java.lang.NumberFormatException: For input string: "3monkeys"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at gift1.main(gift1.java:32)
Java Result: 1

Почему это происходит и как я могу это исправить?


person kullalok    schedule 23.07.2012    source источник


Ответы (3)


Поскольку вы добавляете каждую строку к строке через temp += cString, у вас есть «3» + «обезьяны», то есть «3monkeys». Вы можете решить эту проблему, добавив пробел после каждой строки; temp += cString + " ".

person Zong    schedule 23.07.2012

StringTokenizer не создает токены с новыми строками

В результирующем String нет символов новой строки. Чтобы изменить это..

String eol = System.getProperty("line.separator");
...
  temp += cString + eol;

В конце концов, я бы выбросил этот код и начал заново.

  1. Используйте StringBuilder вместо String +=
  2. Но тогда зачем вообще добавлять первую строку в String, если ожидается, что она будет целым числом? Немедленно проанализируйте его и после этого игнорируйте String, который был прочитан для 1-й строки.
person Andrew Thompson    schedule 23.07.2012
comment
Это следует пометить как правильный ответ, поскольку он работает кроссплатформенно и является чистым способом. - person Caten; 23.03.2017

Что происходит, если вы объединяете 3 и обезьяны с этими

while( f.hasNextLine() ) {
    String cString = f.nextLine();
    temp += cString;
}

поэтому temp теперь будет содержать 3monkeys, вы удаляете символ новой строки

если вы отформатируете свой входной файл так, чтобы каждая строка была отдельным токеном, то я не думаю, что вам все еще нужен токенизатор, вам просто нужно добавить cString в массив или еще лучше использовать ArrayList, чтобы вам не пришлось возражать размер массива

person Leon    schedule 23.07.2012