【问题标题】:asynchronous output without disturbing the current input prompt异步输出不干扰当前输入提示
【发布时间】:2012-07-09 17:23:35
【问题描述】:

我正在使用 TimerTask 来模拟在线程中运行的程序的一部分,在不可预测的时间产生输出。

package consoletest;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;

public class ConsoleTest {
    public static void main(String[] args) {


        TimerTask tt = new TimerTask(){
            public void run() {
                System.out.print("\n***");
            }
        };

        new Timer(true).schedule(tt, 2000);

        Scanner scanner = new Scanner(System.in);
        System.out.print("enter a command: ");
        String line = scanner.nextLine();
    }
}

我的问题是,如果您在输出发生时主动键入,则输出将插入到当前光标位置,然后将光标放在输出字符串的末尾。

例如,这是我缓慢输入 12345678 的屏幕截图,您可以看到输出插入到我输入的中间。

我不希望这个异步输出如此严重地干扰当前输入光标。如果我可以在光标位置之后打印输出而不更改光标位置,那很好。或者甚至更好的是在当前提示之前完全打印输出(将提示向下移动),但我认为这可能涉及以某种方式结束提示,打印输出,然后在复制任何正在进行的输入时创建一个新提示。

【问题讨论】:

  • 你的意思是我想,当你输入“”在光标后面?所以当你输入: 1 12*** 123*** etc.????请发布一些附加信息。谢谢。
  • @rambocoder 这样做是非常不常见的。命令行应用程序通常设计为只接受参数,然后告诉他们该做什么。
  • @LukasKnuth,是的,我个人也没有注意到很多人这样做。
  • @rambocoder 我没有注意到,这就是为什么我认为它甚至不可能(以理智的方式)。

标签: java command-line


【解决方案1】:

你必须使用这样的东西:

public static void main(String[] args) {

        String input = "";
        char c = (char) System.in.read();
        while(c!=-1){
              c = System.in.read();
              input += c;
              System.out.print("\r"+input+"***"); // \r returns the cursor to the line-beginning
        }

        //extra stuff
}

这也许就是你想要的。抱歉,Java 代码可能是错误的,我是从脑海中写出来的……

【讨论】:

  • nextLine() 会阻塞,直到按下回车键。这无济于事。
  • 我认为您不必使用扫描仪,您应该从 System.in 每个字符中读取...
  • hmmm....我认为你的这个最新想法可以正常工作,只要我可以在 System.in 上进行非阻塞读取
  • 当你以异步方式使用线程I/O时,你应该使用this
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 2013-05-04
  • 2014-04-12
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
相关资源
最近更新 更多