5

我需要less从我的 Java 控制台应用程序中执行带有分页的命令。但是,我发现执行外部命令的唯一方法是Runtime.getRuntime().exec(),这需要我通过流写入/读取输入/输出。所以命令就像cat工作(less实际上确实像cat),但我需要分页功能。

在 C 中,我会使用system(). 在 Ruby 中,Kernel.exec完成了这项工作。

有没有办法在 Java 中完成这项工作?

4

2 回答 2

2

当您使用其标准输入和输出流执行外部进程时,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。

于 2012-01-30T15:17:59.903 回答
0

项目清单

以下程序将起作用,最初它打印 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();
            }
        }
     }
}
于 2012-01-30T15:36:10.653 回答