Задержка ввода-вывода вызывает 2 итерации цикла for в JAVA

Я тестировал какой-то фрагмент кода и наткнулся на кое-что интересное, по которому мне нужно было мнение экспертов.

Простая программа, которая останавливает цикл, когда входом является s, но кажется, что на каждом входе цикл повторяется дважды, я думаю, это из-за задержки ввода-вывода. Поправьте меня, если я ошибаюсь.

public static void main(String[] args) throws java.io.IOException {
        int i;
        System.out.println("Type s to stop.");
        for(i = 0; ; i++) {
            char value = (char) System.in.read();
            if (value=='s'){
                break;
            }
            System.out.println("Pass # " + i);
        }
    }

выход:

Задержка ввода-вывода вызывает 2 итерации цикла for в JAVA

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы вводите char a в качестве входных данных, фактически вводятся два символа.

  • a
  • \n

Но когда вы читаете char, он читает один за другим. Следовательно, он закручивается дважды.

Любое объяснение, почему он может даже повторяться 3 раза?

XtremeBaumer 04.07.2018 09:12

@XtremeBaumer Я не могу воспроизвести вашу проблему с повторением 3 раза в Windows. Вы используете Linux? Это может добавить \r\n после ввода символа. Это объясняет 3-х кратный цикл, я думаю

Lino 04.07.2018 09:14

Это будет зацикливать длину введенного chars +1. Если вы введете ab, он будет повторяться 3 раза.

Pankaj Singhal 04.07.2018 09:15

ab - это 2 символа. @PankajSinghal

Danyal Sandeelo 04.07.2018 09:15

Да. Вот что я сказал: если вы введете ab, он будет зацикливаться 3 раза для a, b, \n соответственно. Ситуация, с которой может столкнуться @XtremeBaumer.

Pankaj Singhal 04.07.2018 09:16

Я нахожусь в Windows, и символы, которые он получает для ввода 1, - это 49, 13, 10. Похоже, у меня тоже \r\n на Windows

XtremeBaumer 04.07.2018 09:17
13 - это \r, а 10 - это \n. Итак, a\r\n - это то, что на самом деле вводится
Pankaj Singhal 04.07.2018 09:18

Так что, возможно, печатать только тогда, когда !Character.isWhitespace(value)

Lino 04.07.2018 09:19

@Lino Windows - это ОС, которая по умолчанию использует \ r \ n, Linux использует только \ n

Erwin Bolwidt 04.07.2018 09:20

@ErwinBolwidt, тогда я что-то перепутал. Пользуюсь windows но \r\n не встречал

Lino 04.07.2018 09:22

Другие вопросы по теме