一些程序生成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解析输出。
不打印整行(与println
或打印%n
一样),而是写退格字符(b
)或不换行的空回车(r
),以将光标移回要打印的内容的前面。
由于您已经用bash
标记了这个问题,我假设您正在运行linux/cygwin。因此,该终端很可能与ANSI兼容。在这种情况下,您还可以使用ANSI转义序列。。。
例如:
echo -e "Hello worldrHi"
# Produces "Hillo world" since the line is not cleared before printing "Hi".
echo -e "Hello worldre[KHi"
#produces "Hi" (prints "Hello world", goes to 1st column, clears to last column, prints "Hi")
# For more details, refer above link.
如果您需要在循环中运行它(这是最明显的情况),请确保
- 您不在消息字符串后放换行符,或者
- 使用ANSI转义序列-"\e[A"(或"\e[<n>A",其中n=行数)恢复垂直光标移动(由于"\n")
注:
上面给出的代码是bash命令。对不起,我对java语法不太熟悉,但据我所知,
- echo将被转换为
System.out.println
- 使用
System.out.printf
可以实现没有最后一行换行符的回波 - &
e
是指<ESC>
字符(ascii=27),可以用java字符串中的