Как сделать так, чтобы ввод с консоли Java пропадал после нажатия Enter - PullRequest
1 голос
/ 09 мая 2009

Я использую класс Scanner для получения некоторого ввода от пользователя через консоль. Всякий раз, когда пользователь вводит что-то на экране и нажимает ввод, ввод остается на экране, например:

Это подсказка // Пользователь пишет команду и нажимает ввод

  • Команда
  • здесь вывод команды

// Использовать команду write3

  • Команда
  • вывод команды идет сюда
  • command3
  • вывод команды3 идет сюда

Можно ли как-то заставить введенную команду не оставаться в консоли после нажатия клавиши ввода?

Например:

// Пользователь пишет команду

  • вывод команды идет сюда

Ответы [ 3 ]

5 голосов
/ 09 мая 2009

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

Длинный ответ: в Java все консольные операции обрабатываются через потоки ввода и вывода - System.in - это входной поток, а System.out и System.err - выходные потоки. Как вы можете убедиться, нет способа изменить выходной поток в Java - по сути, все, что действительно делает выходной поток, это выводит байты в некоторый пункт назначения (что является одной из причин, почему он называется «потоком»). "- это в одну сторону). *

Единственный обходной путь, который я вижу, - использовать вместо него объект Console (из System.console()). В частности, метод readPassword() не отображает то, что пользователь вводит обратно в консоль. Однако у этого подхода есть три проблемы. Прежде всего, класс Console доступен только в Java 1.6. Во-вторых, я бы не рекомендовал использовать это для ввода, отличного от паролей, так как это сделало бы ввод команд более проблематичным, чем это должно быть. И, в-третьих, он все равно не сотрет подсказку с экрана, что, по-моему, лишит цели того, чего вы пытаетесь достичь.

* - Технически говоря, System.out и System.err являются экземплярами PrintStream, но PrintStream - это в значительной степени просто гибкая версия OutputStream - PrintStream по-прежнему похожа на обычный поток вывода в этом выводе односторонняя операция.

1 голос
/ 09 мая 2009

Вам будет трудно сделать это со стандартной библиотекой.

Если вы не хотите делать это самостоятельно , вы можете сделать это с помощью сторонней библиотеки, такой как JLine .

0 голосов
/ 10 мая 2009

хах - я всегда предполагал, что если вы отправите символы возврата ('\ b') в sysout, то это очистится - но я никогда не пробовал (не делаю сейчас много консольного программирования).

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

Обратите внимание, что это может не работать в консоли IDE, но может работать в обычной консоли ОС ...

Я оставлю доказательство наверняка, что это работает как упражнение для ОП: -)

...