我需要less
从我的 Java 控制台应用程序中执行带有分页的命令。但是,我发现执行外部命令的唯一方法是Runtime.getRuntime().exec()
,这需要我通过流写入/读取输入/输出。所以命令就像cat
工作(less
实际上确实像cat
),但我需要分页功能。
在 C 中,我会使用system()
. 在 Ruby 中,Kernel.exec完成了这项工作。
有没有办法在 Java 中完成这项工作?
我需要less
从我的 Java 控制台应用程序中执行带有分页的命令。但是,我发现执行外部命令的唯一方法是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。
项目清单
以下程序将起作用,最初它打印 10 行,然后按 Enter 它将打印下一行直到文件末尾。运行类似 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();
}
}
}
}