Как выполнить «меньше» с подкачкой из консольного приложения Java? - PullRequest
4 голосов
/ 30 января 2012

Мне нужно выполнить команду less с подкачкой из моего консольного Java-приложения.Тем не менее, единственный метод, который я нашел для выполнения внешних команд - это Runtime.getRuntime().exec(), который требует от меня записи / чтения ввода / вывода через потоки.Так что такие команды, как cat работают (а less на самом деле действуют как cat), но мне нужна функциональность подкачки.

В C я бы использовал system().В Ruby Kernel.exec выполняет свою работу.

Есть ли способ сделать это в Java?

Ответы [ 2 ]

1 голос
/ 30 января 2012

Когда вы выполняете внешний процесс с Runtime.exec(), его стандартные потоки ввода и вывода не подключаются к терминалу, с которого вы запускаете программу Java. Вы можете использовать перенаправление оболочки для подключения, но сначала вам нужно знать, какой терминал использовать. Нет способа найти терминал, используя стандартный 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.

0 голосов
/ 30 января 2012

Элемент списка

Следующая программа будет работать, сначала она напечатает 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();
            }
        }
     }
}
...