Bash非滚动终端输出

时间:2013-07-31 04:52:52

标签: java bash

某些程序以一种方式产生bash输出,使得用户体验像改变值而不是打印行的字符串(bash向下滚动以显示所有变化的输出)。这种现象叫什么?如何在例如java程序或bash脚本中实现。如何解析输出?它只是打印新线但使用一些特殊功能?

top是一个使用输出数据“现象”的程序


使用了Okey游标。

然后我如何在java中解析它们?我试过这段代码,但它没有打印任何东西

public static void exeTest(String [] args) throws IOException{
        if (args.length <= 0) {
            System.out.println("empty command");
            return;
        }

       Process process = new ProcessBuilder(args).start();
       InputStream is = process.getInputStream();
       InputStreamReader isr = new InputStreamReader(is);
       BufferedReader br = new BufferedReader(isr);


       System.out.printf("Output of running %s is:", 
          Arrays.toString(args));
       String line;
       while ((line = br.readLine()) != null) {
            System.out.println(line);
       }

感谢所有好的答案,我现在对这个主题更熟悉了,即使你仍然无法解析像java中的top那样的程序输出。我会关闭这个问题,并进一步研究如何在java中解析它。然后我可以开始另一个更具体的问题,就是解析java中的输出。

4 个答案:

答案 0 :(得分:3)

不是打印整行(与println或打印%n一样),而是写入退格符(\b)或没有换行(\r)的裸回车来移动光标回到你要打印的内容之前。

答案 1 :(得分:2)

由于您已使用bash标记了问题,因此我假设您正在运行linux / cygwin。因此终端可能与ANSI兼容。在这种情况下,您还可以使用ANSI escape sequences ...

e.g:

echo -e "Hello world\rHi"
# Produces "Hillo world" since the line is not cleared before printing "Hi".
echo -e "Hello world\r\e[KHi"
#produces "Hi" (prints "Hello world", goes to 1st column, clears to last column, prints "Hi")
# For more details, refer above link.

如果你需要在循环中运行它(这是最明显的情况),请确保

  1. 您没有在消息字符串后面添加换行符,或者
  2. 使用ANSI转义序列恢复垂直光标移动(由于“\ n”) - “\ e [A”(或“\ e [&lt; N&gt; A”,其中N =行数。)< / LI>

    注:

    上面给出的代码是bash命令。对不起,我对java语法并不熟悉,但据我所知,

    1. echo将转换为System.out.println
    2. 使用System.out.printf 可以实现
    3. 没有上一个换行符的回声
    4. &安培; \e引用<ESC>字符(ascii = 27),可以使用java字符串中的\033来实现。

答案 2 :(得分:0)

你可以这样说,我的意思是印刷新的线条。想象一下你有循环:

String header = "Current val:";
String buffer = "";
for(int i = 0; i < val; i++) {
    buffer = header + " " + i + "\n";
    buffer += (val - i) + "iterations left\n";
    //add other strings to buffer...
    //Clear console here
    //Print buffer
}

因此,当变量发生变化时,输出将显示为静态。

其他更强大的方法是使用goto(x, y)类似函数进行精确输出操作。 Java在标准api中没有这个,但是有它的库。 Java gotoxy(x,y) for console applications

答案 3 :(得分:0)