我需要从我的Java控制台应用程序执行带有分页的less
命令。但是,我发现执行外部命令的唯一方法是Runtime.getRuntime().exec()
,这要求我通过流写入/读取输入/输出。所以像cat
这样的命令(和less
实际上就像cat
一样),但我需要分页功能。
在C中,我使用system()
。在Ruby中,Kernel.exec完成了这项工作。
有没有办法在Java中完成这项工作?
答案 0 :(得分:1)
使用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。
答案 1 :(得分:0)
列出项目
以下程序可以使用,最初它打印10行,然后按回车它将打印下一行直到文件结束。 运行程序就好 java Less $ fileName
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Less
{
public static void main(String args[]) throws IOException
{
FileReader reader = new FileReader(args[0]);
BufferedReader buff = new BufferedReader(reader);
String readLine;
int lineCount = 0;
while ((readLine = buff.readLine()) != null)
{
System.out.println(readLine);
lineCount++;
if (lineCount > 10)
{
Scanner scanner = new Scanner(System.in);
scanner.nextLine();
}
}
}
}