2013-04-14 2 views
4

Скажите, что я хочу напечатать текстовое приглашение в java, а затем получить вход от пользователя из System.in. Но другой поток может писать в System.out и «снимает» вход, но текстовое приглашение остается, что нормально.Есть ли способ заставить текст команды следовать за вводом?

Введите вход здесь ->
<waiting for input ...>

Но если поток пишет что-то происходит следующее:

Введите вход здесь ->
...
.. .
...
Резьбовой выпуск he повторно
...
...
<Waits for input here>

Есть ли трюк, чтобы "привязать" вход с текстом запроса?

ответ

2

Вы можете обернуть ваш system.outs в класс журнала, а когда вы хотите распечатать что-то, добавьте его в очередь в новом классе ведения журнала.

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

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

+0

Действительно, это более подробное описание концепции обертки, о которой я упоминал. –

+0

Спасибо. Было бы неплохо, если бы существовало уже существовавшее, но я лично ни о чем не слышал. –

2

Есть ли какой-либо трюк, чтобы «связать» ввод с текстом приглашения?

Nope. Это ваш код; вам решать сотрудничать с вами. Это может означать создание (или поиск библиотеки, которая предоставляет) API-интерфейс обертки около System.(in|out), поэтому вам не нужно беспокоиться о случайном причинении этой проблемы. Но нет, нет волшебной серебряной пули.

1

Я не уверен, существуют ли какие-либо существующие реализации, но эта задача должна быть достаточно простой.

Сделайте класс, например SyncConsole, который синхронизирует ваши отпечатки и чтения.

В основном есть только один сингл SyncConsole в коде, который записывает и читает в io потоки консоли.

Тогда ваша программа может сделать что-то вроде

SyncConsole.readInput("Text to display"); 
SyncConsole.print("Text"); 

Эти вызовы могут затем быть синхронизированы в соответствии с вашими потребностями. Например, если запрошенный код запросил вход, запросы буфера для печати до получения ввода и т. Д.

Если вы знакомы с параллелизмом в java, это должно быть довольно просто построить и даст вам желаемое поведение.

1
import java.util.LinkedList; 
import java.util.Queue; 

public class MainDemo { 

    public void queueExample() { 

     Queue queue = new LinkedList(); 

     queue.add("Java"); 
     queue.add("DotNet"); 

     queue.offer("PHP"); 
     queue.offer("HTML"); 

     System.out.println("remove: " + queue.remove()); 
     System.out.println("element: " + queue.element()); 
     System.out.println("poll: " + queue.poll()); 
     System.out.println("peek: " + queue.peek()); 

    } 

    public static void main(String[] args) { 
     new MainDemo().queueExample(); 
    } 
} 
+0

Аккуратно, но я не уверен, что это важно? – Rup

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