如何在Java控制台中的其他两行之间插入行?

时间:2019-06-19 22:20:03

标签: java logging console

我正在设置一个控制台命令界面,其中输入行应始终是每隔一行下面的行。因此,如果在我在输入行中写入内容时另一个线程打印了内容,则会中断。因此,一切都搞砸了,我无法在Windows,Linux中清楚地编辑输入内容。

因此,如果此箭头是我的应用程序开始从控制台读取该行的箭头
>

如果我写点东西
> myInput

和其他一些线程会打印出一些内容。
> myInputLogFromOtherThread

然后输入将以最新的日志中断,并且光标将跳至“无人区”,并且我无法像上面所说的那样编辑输入(我仍然可以编辑它,但看不到更改)

我尝试了许多不同的Api,例如JLine,Cursors,Lanterna,但它们对我没有用。 Lanterna落后了,Cursors和JLine根本没有运行,而且我也没有找到任何有用的文档来了解如何制作自己想要的东西

这是我的代码,在println事件中,我想在输入行> myInput和输入之前的行之间插入要打印到控制台的行。

    public static void main(String[] args) {

        //On System.out.println event
        System.setOut(new PrintStream(System.out) {
            public void println(String s) {
                super.println(s); // So i want that this line, gets insertet between the last line and the line before the last line
                /*
                 * So it should be inserted
                 * 
                 * SomeRandomLogging
                 *  <- here, that it doesn't interrupt our input
                 * > myInput
                 */
            }
        });

        System.out.print("> ");

        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("LogFromOtherFread");
            }
        }).start();

        final List<String> lines = new ArrayList<>();
        try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in))) {
            String line = null;
            while ((line = in.readLine()) != null) {
                lines.add(line);
            }
        }
    }

所以我希望在应用程序将要打印的行移动到控制台之后,在输入行之前,它应该像命令界面一样工作。 Linux,Bukkit(Minecraft Server Api),...

1 个答案:

答案 0 :(得分:0)

您可以查看一些终端控制库,以将光标强制到特定的列/行

here是一则帖子,您可以关注Charva或lanterna