2016-07-01 6 views
1

次のオブジェクトを使用して、Javaコードからbashコマンドを実行しています。Javaプログラムを使用して実行されるBashコマンドの処理入力

public class Scripter { 
    private final String[] ENV = {"PATH=/bin:/usr/bin/"}; 

    private String cmd; 
    private Process process; 

    public Scripter(String cmd) throws IOException { 
     this.cmd = cmd; 
     process = Runtime.getRuntime().exec(cmd, ENV); 
    } 
} 

今私は、このオブジェクトを呼び出すと、この関数で出力を印刷しようとしています。

public static void main(String[] args) { 
    Scripter gitCheck; 

    try { 
     gitCheck = new Scripter("git --version"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    Scanner sc = new Scanner(System.in); 
    if (sc.hasNext()) { 
     System.out.println(sc.next()); 
    } 
} 

プログラムは無限ループになり、何もしません。私はここで間違って何をしていますか?

+0

コードにループがありません。 – shmosel

+0

このプログラムの標準入力には何が入っていますか? (gitコマンド、Javaプログラムではない)あなたはそれを読んでいる。あなたが何かをパイプしないで(そしてそれを閉じると)、無限にブロックされます(無限ループではありません)。 –

+1

無限ループではなく、 'sc.next()'に何かを入力するのを待っています。 'ProcessBuilder'とプロセスの入出力ストリームを取得する方法について読んでおく必要があります。 'System.in'は魔法のようにプロセスにアタッチされません。 –

答えて

3

あなたはJavaプロセスの標準入力から文字列を読み込むしようとしている:

Scanner sc = new Scanner(System.in); 
if (sc.hasNext()) { ... } 

だからあなたのJavaプログラムは、あなたが実際にその標準入力に何かを渡すまでブロック、または標準入力を閉じます。

(それは無限ループではありません、それはgitのコマンドとは関係ありません)

あなたはgitのコマンドの出力を読み取ろうとしている場合、あなたはprocess.getInputStream()代わりのSystem.inを読む必要があります。

+0

これは私のために働いた。これを行うために私のコードを修正しました。 'InputStreamは= gitCheck.getProcess()。getInputStream();です。 System.out.println(convertStreamToString(is)); ' –

関連する問題