2012-01-30 12 views
4

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

Cでは、system()を使用します。 Rubyでは、Kernel.execがその仕事をしています。

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

答えて

1

Runtime.exec()で外部プロセスを実行すると、その標準入力ストリームと出力ストリームは、Javaプログラムを実行している端末に接続されません。シェルリダイレクトを使用して接続することはできますが、まずどの端末を使用するかを知る必要があります。標準APIを使用して端末を見つける方法はありませんが、おそらくあなたがそれを行うオープンソースライブラリを見つけることができます。あなたがjava Test $(tty)を使用する必要があり、それを実行するには

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

:それを行うことができることを確認するには

、このプログラムはlessに自分自身を開きます。 ttyプログラムは、stdinに接続されている端末の名前を表示します。

私はこのソリューションの移植性についてあまりよく分かりません。少なくともLinux上で動作します。次のプログラムが動作します

+0

- しかし、引数として渡さずに端末を取得する方法はありますか?私はスクリプトで私のツールをラップすることができますが、私はむしろそれを避けるだろう。 – futlib

+0

基本的にPOSIX関数 'ttyname'のJNIラッパーが必要です。自分で作るか、JPosix(http://kanga.org/jposix/)のような既存のPOSIX Javaライブラリを使うことができます。名前をバイト配列として返す 'ttyname'というメソッドがありますが、試していませんしかし、 – Joni

+0

私は本質的に 'ttyname'と' isatty'のラッパーであるライブラリをgithubに入れました。まだ少し粗いが、使用可能でなければなりません:https://github.com/joni/TTYUtil – Joni

0

リスト項目

、当初は10行を印刷し、それはファイルの最後まで次の行を印刷しますenterキーを押します。 面白い javaの少ない$ファイル名などの実行プログラム

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(); 
      } 
     } 
    } 
} 
関連する問題