Как читать возврат каретки как часть строки со сканером?

Я пишу программу Java, которая потребует от пользователя ввода длинной строки. Большинство этих строк представляют собой новостные статьи, скопированные и вставленные из Интернета. Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь вводит текст, он содержит возврат каретки, который сканер не может обработать. Я использую метод nextLine() из класса Scanner, и проблема в том, что возврат каретки отмечает конец строки и, таким образом, завершает чтение со сканера. Я также пробовал следующий код, но это приводит к бесконечному циклу. UserInput2 — это сканер.

while(userInput2.hasNextLine())
       toBeProcessed = toBeProcessed + userInput2.nextLine();

Кто-нибудь знает, как я могу пропустить возврат каретки? Может быть, сканер преобразует их в «+» или что-то в этом роде, чтобы у меня не было этой проблемы.


person Kurtis    schedule 19.07.2011    source источник
comment
Что вы подразумеваете под бесконечным циклом? Вы говорите, что вводите из командной строки, и это не остановится?   -  person zw324    schedule 19.07.2011
comment
Ну, не совсем так. Сканер не распознает конец вводимого текста, когда я использую цикл while.   -  person Kurtis    schedule 19.07.2011
comment
Вы можете попробовать ввести конец ввода дважды, что сработало для меня, когда я столкнулся с той же проблемой.   -  person zw324    schedule 19.07.2011


Ответы (4)


Во-первых, примечание: вместо объединения объектов String вам следует изучить StringBuilder.

Во-вторых, вы можете использовать useDelimiter для чего-то, что никогда не будет во входной строке, или более хорошим методом будет использование общих IOUtils Apache с InputStream, как в этот вопрос вместо использования сканера, что дает вам преимущество указания кодировки символов .

Вы можете удалить символы '\r' с помощью String.replace().

person Martin Foot    schedule 19.07.2011

Так что не используйте сканер. Используйте InputStream напрямую и преобразуйте байты в строки.

person AlexR    schedule 19.07.2011

Независимо от того, какой метод вы используете, у вас должен быть какой-то признак завершения ввода. В случае Scanner вы можете uuseDelimiter, чтобы установить разделитель Scanner на то, что вы хотите.

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

person zw324    schedule 19.07.2011

Вы знаете, что там была новая строка, потому что Scanner использовал ее для определения конца полученной строки. Все, что вам нужно сделать, это повторно вставить то, что, как вы знаете, было там:

while(userInput2.hasNextLine())
   toBeProcessed = toBeProcessed + userInput2.nextLine() + "\n";

Комментарий Мартина об использовании StringBuilder верен. Это изменит ваш код, чтобы он выглядел так:

while(userInput2.hasNextLine()) {
   toBeProcessedSB = toBeProcessedSB.append(userInput2.nextLine()); 
   toBeProcessedSB = toBeProcessedSB.append("\n"); 
}
toBeProcessed = toBeProcessedSB.toString();
person rossum    schedule 19.07.2011