0

Javaファイルから以下を実行しようとしています。
私はphpバージョンを表示しようとしていますが、後でphpファイルを実行するように変更されます。

 Process p = Runtime.getRuntime().exec("cmd /C PHP/php.exe -v");
 BufferedReader in = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }

プログラムを実行すると、エラーは発生しません。しかし、コンソールには何も表示されません:(
ありがとう。

4

2 に答える 2

4

プロセスが実行されるのを待つ必要があり、引数を分離する必要があります。

Process p = Runtime.getRuntime().exec("cmd", "/C", "PHP/php.exe", "-v");
BufferedReader in = new BufferedReader(new InputStreamReader( p.getInputStream()));
p.waitFor();
String line = null;
while ((line = in.readLine()) != null) {
     System.out.println(line);
}

ところで、プロセスの実行中に問題が発生した場合はいつでも、エラー ストリームも確認することをお勧めします。

于 2012-11-29T11:06:52.600 に答える
3

問題は次のいずれかであると思われます。

  • php.exePHP/php.exeたとえば、あるべきPHP\php.exeか何かのために、まったく実行されていません。
  • コマンドは、バージョン情報を「出力」ストリームではなく「エラー」ストリームに書き込んでいます。

いずれにせよ、エラーストリームからの読み取りを試す必要があります。cmdまたはからのバージョン情報またはエラーメッセージが表示されますphp.exe


@dystroyの答えが間違っている理由も詳しく説明する必要があります。

execコマンドを実行するための新しい外部プロセスを作成することです。このプロセスはJVMに接続されているため、アプリケーションがgetOutput()ストリームに書き込むとき、それは外部プロセスの「標準入力」に送られ、外部プロセスがその「標準出力」と「標準エラー」に書き込むとき、データは次のことができます。それぞれgetInput()getError()ストリームを使用して読み取ることができます。

それぞれのストリーム間の接続は、オペレーティングシステムによって提供される「パイプ」を使用して実装されます。

パイプについてのことは、それが限られたバッファリング容量しか持っていないということです。一方のプロセスが一方の端に書き込みを行っていて、もう一方のプロセスが読み取りを行っていない場合、書き込みプロセスは最終的に書き込みを停止するように強制されます。または、より正確には、書き込みシステムコールでブロックし、パイプラインがドレインするのを待ちます。

@dystroyの答えは、Java側でこれを行うと言っています:

  1. プロセスを開始します。
  2. プロセスが完了するのを待ちます
  3. プロセスからの出力を読み取ります。

ただし、外部プロセスが大量の出力を書き込む場合、パイプへの書き込み中にブロックされるため、完了できません。その間、Java側は、パイプからデータの読み取りを開始する前に、外部プロセスが完了するのを待機しています。

デッドロック。

于 2012-11-29T11:14:57.287 に答える