Разбор ввода с клавиатуры Java в консольном приложении - PullRequest
8 голосов
/ 05 января 2009

Я только что начал возиться с JLine для анализа ввода символов в режиме консоли. Вроде хорошо работает, но мне интересно:

Есть ли в JLine неблокирующий способ узнать, доступны ли символы? (то есть как kbhit() в Windows.)

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

РЕДАКТИРОВАТЬ : Это синтаксический анализ. Я не собираюсь использовать графический интерфейс. Обычный ввод / вывод InputStream в Java в режиме консоли требует, чтобы вы сначала нажали клавишу Enter (например, это только буферизованный ввод). Пожалуйста, не говорите мне, что посимвольный ввод в консольном режиме невозможен в Java; это не так JLine делает это, используя переносимый интерфейс с реализацией, зависящей от платформы.

Редактировать обновление : мне удалось собрать вместе вспомогательный класс, чтобы выполнить блокировку ввода-вывода в рабочем потоке (используя JLine для ввода-вывода для каждого символа, предупреждение: вам нужно проанализировать Ctrl-C самостоятельно!) И затем общайтесь через синхронизированную очередь с помощью подпрограммы isempty (). Для того, что я делаю сейчас, это хорошо, но мне бы очень хотелось знать, как сделать это в будущем.

Ответы [ 2 ]

4 голосов
/ 09 января 2009

Вы, кажется, на правильном пути.

Я думаю, что «правильный» способ сделать это - рабочий поток, который выливает весь блокирующий ввод / вывод в неблокирующую очередь. Посмотрите на ConcurrentLinkedQueue из java.util.concurrent .

3 голосов
/ 05 января 2009

Нельзя использовать консоль для получения неблокирующего ввода без собственных библиотек.

Вам придется написать приложение Swing и написать KeyListener

Прочитайте этот урок: http://java.sun.com/docs/books/tutorial/uiswing/events/keylistener.html

...