有没有办法让命令文本跟随输入?

时间:2013-04-14 16:09:33

标签: java

假设我想在java中打印文本提示,然后从System.in获取用户的输入。但另一个线程可以写入System.out并“取消”输入但文本提示保持不变,这是正常的。

  

在此输入输入 - >
  <waiting for input ...>

但是如果一个线程写出了以下内容:

  

在此输入输入 - &gt;
  ...
  ...
  ...
  这里的螺纹输出
  ...
  ...
  <Waits for input here>

是否有任何技巧可以将输入与提示文本“绑定”?

4 个答案:

答案 0 :(得分:2)

  

是否有任何技巧可以将输入与提示文本“绑定”?

不。这是你的代码;你应该和自己合作。这可能意味着围绕System.(in|out)构建(或找到提供的库)包装器API,这样您就不必担心意外导致此问题。但不,没有神奇的银弹。

答案 1 :(得分:2)

您可以将system.outs包装到日志记录类中,当您想要打印某些内容时,将其添加到新日志记录类中的队列中。

当你要求用户输入时,让它在日志记录类中激活一个锁,这样在提交用户输入之前队列中的任何内容都不会打印,然后打印队列中的所有输出。

这将导致所有输出文本在输入进入时暂停。它不会中断您的输入,因此输入将绑定在光标周围,但您也不会获得任何输出。如果值得的话,由你决定。

答案 2 :(得分:1)

我不确定是否存在任何现有实现,但此任务应该足够简单。

创建一个类,例如SyncConsole,它可以同步您的打印和读取。

在代码中基本上只有SyncConsole单例,可以写入和读取控制台的io流。

然后您的程序可以执行类似

的操作
SyncConsole.readInput("Text to display");
SyncConsole.print("Text");

然后可以正确同步这些呼叫以满足您的需求。例如,如果某些代码请求输入,缓冲请求打印直到收到输入等等。

如果您熟悉java中的并发性,那么构建它应该非常简单,并且会为您提供所需的行为。

答案 3 :(得分: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();
    }
}