我需要从我的 Java 控制台应用程序执行带分页的 less
命令。但是,我发现执行外部命令的唯一方法是 Runtime.getRuntime().exec()
,这需要我通过流写入/读取输入/输出。所以像 cat
这样的命令可以工作(less
实际上就像 cat
一样),但我需要分页功能。
在 C 中,我会使用 system()
。在 ruby 中,Kernel.exec完成工作。
有什么方法可以用 Java 完成吗?
最佳答案
当您使用 Runtime.exec()
执行外部进程时,其标准输入和输出流未连接到您运行 Java 程序的终端。您可以使用 shell 重定向来连接它,但首先您需要知道要使用哪个终端。无法使用标准 API 找到终端,但您可能可以找到一个开源库来执行此操作。
要查看它是否可以完成,该程序在 less
中自行打开:
public class Test {
public static void main(String[] args) throws Exception {
Process p = Runtime.getRuntime().exec(
new String[] {"sh", "-c",
"less Test.java < "+args[0] + " > "+args[0]});
System.out.println("=> "+p.waitFor());
}
}
要运行它,您应该使用 java Test $(tty)
。 tty
程序打印连接到其标准输入的终端的名称。
我不太确定这个解决方案的可移植性;至少它适用于 Linux。
关于java - 如何从 Java 控制台应用程序通过分页执行 "less"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9065210/