Почему необходимо добавлять \n и \r при отправке ввода работающему процессу?
Я пытаюсь добавить Java из исполняемого файла, созданного Visual Prolog, запустив его как процесс.
Я использовал этот ответ для реализации процесса взаимодействия. Мой Visual Prolog ожидает число из командной строки, он даже проверяет его (независимо от того, является ли он термином Prolog или нет), но при запуске из Java он не распознает ввод как действительный. Эти символы в скобках превращают мой номер в строку?
Когда я пытаюсь удалить их, моя Java-программа зависает, а исполняемый файл Visual Prolog не отвечает. Я думаю, что это похоже на нажатие кнопки ввода.
4 ответа
\r\n - это последовательность EOL (конец строки) в Windows.
Если ввод ориентирован на чтение строки, то потребительский код не будет обрабатывать строку до тех пор, пока EOL (или EOF) не будет отправлен - это заставит потребителя "зависать", пока он действительно терпеливо ждет остальную часть строки. Рассмотрим Scanner.nextLine в Java: nextLine не вернется, пока не будет готова полная строка!
Решение: отправьте EOL с соответствующим вводом в Visual Prolog; или закройте входной поток.
Также см. Также "line.separator", возможно. Тем не менее, различные println
(печать строки) методы должны уже включать соответствующий EOL.
\r возврат каретки CR \n перевод строки LF
многие текстовые протоколы требуют использования CR+LF, а некоторые требуют распознавания на LF.
Это похоже на запуск новой строки в тексте в Windows
Приведенный пример использует каналы (перенаправление stdin и stdout) для связи между процессами, но вы говорите, что ваша программа ожидает число в командной строке.
Это необходимо тогда и только тогда, когда этого требует целевой процесс.
Вы утверждаете, что вашему процессу "требуется число из командной строки", но если вы вводите его через его стандартный ввод, этого не может быть.
Вместо этого, кажется, требуется номер через строку, введенную в консоль.
В любом случае слово "строка" указывает на необходимость в конце строки.