5

一些程序以用户体验的方式向 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 中的顶部那样的程序输出。我会结束这个问题,并就如何在 java 中解析这个问题做更多的研究。然后我可能会开始另一个更具体的关于在 java 中解析输出的内容。

4

4 回答 4

4

不要打印整行(如使用println或打印%n),而是写退格字符(\b)或不带换行符的空回车(\r),以将光标移回要打印的内容前面。

于 2013-07-31T04:57:05.467 回答
2

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

例如:

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[<N>A”,其中 N= 行数。)

笔记:

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

  1. echo 会被翻译成System.out.println
  2. 没有最后一个换行符的回声可以通过System.out.printf
  3. &\e指的是<ESC>字符(ascii = 27),可以用\033java中的字符串来实现。
于 2013-07-31T05:56:21.383 回答
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)

于 2013-07-31T05:03:01.220 回答
0

curses可以用来完成这个。搜索“java curses”和“bash curses”会得到很好的结果。


爪哇:

http://sourceforge.net/projects/javacurses/

什么是用于终端应用程序的好的 Java、curses 类库?

在 Java 中获得文本用户界面(类似 ncurses)功能的最佳方式是什么?

对于重击:

https://code.google.com/p/bashsimplecurses/

于 2013-07-31T05:21:59.390 回答