Как читать возврат каретки как часть строки с помощью сканера? - PullRequest
0 голосов
/ 19 июля 2011

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

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

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

Ответы [ 4 ]

1 голос
/ 19 июля 2011

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

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

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

0 голосов
/ 20 июля 2011

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

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

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

while(userInput2.hasNextLine()) {
   toBeProcessedSB = toBeProcessedSB.append(userInput2.nextLine()); 
   toBeProcessedSB = toBeProcessedSB.append("\n"); 
}
toBeProcessed = toBeProcessedSB.toString();
0 голосов
/ 19 июля 2011

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

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

0 голосов
/ 19 июля 2011

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

...