5

lessJava コンソール アプリケーションから、ページングを使用してコマンドを実行する必要があります。ただし、外部コマンドを実行するために私が見つけた唯一の方法はRuntime.getRuntime().exec()、ストリームを介して入力/出力を読み書きする必要がある. したがって、コマンドは機能しますcat(less実際には のように動作しますcat) が、ページング機能が必要です。

Cでは、私はsystem(). Ruby では、Kernel.execがその役割を果たします。

Javaでこれを行う方法はありますか?

4

2 に答える 2

2

標準入力および出力ストリームを使用して外部プロセスを実行すると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プログラムは、stdin に接続されている端末の名前を表示します。

このソリューションの移植性についてはよくわかりません。少なくとも 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 に答える