如何从Java控制台应用程序执行“less”执行分页?

时间:2012-01-30 14:17:26

标签: java console paging less

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

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

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

2 个答案:

答案 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();
            }
        }
     }
}