2015-04-26 2 views
1

Я использую этот код для вывода текста и нажмите кнопку , введите, чтобы отобразить следующую строку диалога. Однако одно нажатие Введите показывает две строки текста. Почему это?Нажмите enter, чтобы продолжить странности (Java)

public void pressEnterToContinue() { 
    try { 
     System.in.read(); 
    } catch(Exception e) { } 
} 

Для справки, метод называется так:

pressEnterToContinue(); 
System.out.println("This is a line of text."); 
pressEnterToContinue(); 
System.out.println("So is this."); 
pressEnterToContinue(); 
System.out.println("And this."); 
//etc. 

В первой строке отображается одна «Это строка текста.» Метод ждет, пока пользователь не нажмет кнопку ввода, затем отобразит следующие две строки («Это так» и «И это»), когда он должен отображать только один.

Я попытался выполнить небольшую задержку, но это не решило проблему.

ответ

0

System.in.read() читает один байт. Я предполагаю, что вы запускаете свой код на платформе, где новая строка представлена ​​двухбайтовой последовательностью CR LF, поэтому нажатие клавиши Enter удовлетворяет первому вызову System.in.read() с CR, а второй System.in.read() вызывает LF. Изменение кода для использования System.console().readline() вместо этого должно исправить это, но посмотрите discussion and other approaches described here и solutions discussed here.

И вот ссылка на информацию о том, как новая линия представлена ​​на разных платформах.

+0

Это дает мне ошибку «Метод readLine() не определен для метода InputStream. Рекомендуемые исправления:« Изменить на чтение (..) »(мы знаем, что это не план) и« добавьте Cast to System, in », делая строку \t try {((BufferedReader) System.in) .readLine(); Это дает мне новую ошибку «Нельзя отбрасывать из InputStream в BufferedReader» – 4oursword

+0

А ... Да, забыл об этом. System.console(). readline() работает, но см. ответы здесь для дальнейшего обсуждения и различных подходов: http://stackoverflow.com/questions/4644415/java-how-to-get-input-from-system-console Я обновил свой ответ чтобы отразить это. –

+0

System.console(). readline() отображает все строки текста сразу, как только вызывается метод. – 4oursword

2

Нажатие клавиши ввода эхо возвращает новую линию. println вводит еще одну строку. Когда вы набираете консоль, O.S. отголоски каждого персонажа, и, как таковой, ваш вход возвращается обратно, а затем ваш код печатает его снова на экране. Это потому, что вы имеете дело с оболочкой, которая сама по себе является программой, которая подбирает ваши нажатия клавиш и отгоняет их обратно.

Возможно, была написана оболочка, которая не отвечает за вход пользователя, но будет непрактичной для ошибочных людей. Возможно, вам захочется поэкспериментировать telneting с сервером smtp или http-сервером на соответствующем порту и ввести соответствующие команды для отправки почты или получения html-страницы. Нет эха. Это странно.

+0

Я понимаю это, но я имею в виду, что «так и есть» и «И это» оба показаны. – 4oursword

Смежные вопросы