2017-04-05 15 views
-3

ProcessオブジェクトをJavaで作成します(プログラムはhtml tidyが重要な場合)。stdin(Process.getOutputStream())でデータをフィードしてストリームを閉じます。プロセスが終了しないため、Process.waitFor()を返すことはありません。 Process.destroy()に電話することなくこの問題を解決するにはどうすればよいですか?stdinを閉じた後、unixコマンドラインプログラムが終了しない

+1

いいえ、私はちょうど他にこの答えを見つけて、他の人が、私が学んだことの恩恵を受けるかもしれないと思ったことができませんでした。 –

+0

あなたはなぜこれを投票していますか?私は質問を言い換える必要がありますか? –

+1

あなたは本当に同じ回答のUnix版が必要ですか? – Andreas

答えて

-3

tidyは出力を終了する前に出力を消費する可能性があります。これは、プログラムに多くのデータを送り、多くのデータを返すだけの場合に発生します。解決策は、プログラムが終了するのを待つ前に出力を消費することです。これは私がそれ(ない完全なコード)を処理しています方法です:

ProcessBuilder builder = new ProcessBuilder(); 
    //-*snip*- 
    Process p = null; 
    Throwable error = null; 
    int returnCode = -1; 
    String output = null; 
    StringBuilder stdErr = new StringBuilder(200); 
    try{ 
     p = builder.start(); 
     try (Writer w = new BufferedWriter(new OutputStreamWriter(p. 
       getOutputStream()))){ 
      w.write(html); 
     } 
     Process reference = p; 
     //read both outputs so tidy has no reason to wait 
     Thread errReader = new Thread(()->{ 
      StringBuilderWriter writer = new StringBuilderWriter(stdErr); 
      try { 
       IOUtils.copy(reference.getErrorStream(), writer, 
         Charsets.UTF_8); 
      } 
      catch (IOException ex) { 
       //nom... 
       //An IOE that happens here will likely happen when reading 
       //stdout as well. 
      } 
     }); 
     errReader.start(); 
     //tidy might be waiting for us to consume output 
     output = IOUtils.toString(p.getInputStream()); 
     returnCode = p.waitFor(); 
     errReader.join(); 
    } 
+0

あなたは質問を複製するための踏み台として、他人が探している質問を残したいので、回答を削除して返事を返して、それがあなたに与えている否定的な回答をクリアすることができます。 – Andreas

+0

私はできましたが、答えは誰かに役立つかもしれませんし、それほど多くの担当者ではありません。私はむしろ他の人を助けることができます。 –

関連する問題