0

JAVA で ProcessBuilder を使用すると、ls、pwd、echo などの単純なターミナル コマンドを実行できます。

public static void main(String[] args) throws Exception
{
    Runtime r = Runtime.getRuntime();
    Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini");
    p.waitFor();

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = "";
    while ((line = b.readLine()) != null) 
    {
      System.out.println(line);
    } 
}

このコマンドは端末から完全に機能し、実行に約 15 秒かかり、出力が得られます。stackoverflow で同様のトピックを調べましたが、何の助けも見つかりませんでした。この点で助けてください。前もって感謝します。

4

2 に答える 2

2

このコードを参照すると、これが役立つ場合があります....bashを使用してください。コマンドをechoコマンドに置き換えるだけです

ProcessBuilder b = new ProcessBuilder("bash","-c","echo abc");

    Process termProc = null;

    try {
        termProc = b.start();
        BufferedReader stdInput = new BufferedReader(new 
        InputStreamReader(termProc.getInputStream()));
        BufferedReader stdError = new BufferedReader(new 
        InputStreamReader(termProc.getErrorStream()));

        String s = null;
        while ((s = stdInput.readLine()) != null) 
        {
            System.out.println(s);


         }
        while ((s = stdError.readLine()) != null) 
        {

            System.out.println(s);

        }

    } catch (IOException e) {

        e.printStackTrace();
    }
于 2013-03-05T05:46:24.003 に答える
0

InputStream と ErrorStream の両方を監視することを検討してください。出力がおそらく ErrorStream に書き込まれている可能性があるため、何も表示されません。

Runtime.exec() の一般的な落とし穴とその使用方法に関する Javaworldの良い例を次に示します。


私はあなたのコードを最初に見たときにそれを見逃しましたが、あなたが間違っているかもしれないことへのヒントはここにあります:

一部のネイティブ プラットフォームでは、標準の入力ストリームと出力ストリームに対して限られたバッファー サイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りが迅速に行われないと、サブプロセスがブロックされ、デッドロックすることさえあります。

次の行に沿ってコードを更新することを検討してください。

public static void main(String[] args) throws Exception
{
    Runtime r = Runtime.getRuntime();
    Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini");

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = "";
    while ((line = b.readLine()) != null) 
    {
      System.out.println(line);
    } 

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    String line = "";
    while ((line = b.readLine()) != null) 
    {
      System.out.println(line);
    } 

    p.waitFor();
}

注:上に投稿したリンクの例のように、inputstream と errorstream からの出力の表示を処理するスレッドを作成することをお勧めします。

于 2012-12-10T06:43:17.733 に答える