5

Java でサブプロセスの stdin と stdout をリダイレクトしようとしていますが、最終的には、出力を JTextArea などに送信する予定です。

これが私の現在のコードです。

Process cmd = Runtime.getRuntime().exec("cmd.exe");

cmd.getOutputStream().write("echo Hello World".getBytes());
cmd.getOutputStream().flush();

byte[] buffer = new byte[1024];
cmd.getInputStream().read(buffer);
String s = new String(buffer);

System.out.println(s);

出力は次のようになります。

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\(Current Directory)>

「Hello World」文字列が出力されることを期待しています。親プロセスが十分長く存続していないためでしょうか?

また、複数のコマンドを送受信できるようにしたいと考えています。

4

2 に答える 2

10

入力ストリームをリッスンする前に出力ストリームに書き込もうとしたので、何も表示されていないことは理にかなっています。これを成功させるには、2つのストリームに別々のスレッドを使用する必要があります。

すなわち、

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class Foo {
   public static void main(String[] args) throws IOException {
      Process cmd = Runtime.getRuntime().exec("cmd.exe");

      final InputStream inStream = cmd.getInputStream();
      new Thread(new Runnable() {
         public void run() {
            InputStreamReader reader = new InputStreamReader(inStream);
            Scanner scan = new Scanner(reader);
            while (scan.hasNextLine()) {
               System.out.println(scan.nextLine());
            }
         }
      }).start();

      OutputStream outStream = cmd.getOutputStream();
      PrintWriter pWriter = new PrintWriter(outStream);
      pWriter.println("echo Hello World");
      pWriter.flush();
      pWriter.close();
   }
}

また、エラーストリームも無視するべきではありませんが、無視する必要があります。無視すると、バッファスペースが不足する可能性があるため、プロセスが煽られることがあります。

于 2012-05-02T03:35:37.700 に答える
6

現在Runtime.getRuntime().exec()は非推奨です (すべての実用的な目的のため)。ProcessBuilderクラスを使用することをお勧めします。特に、そのメソッドは、stdin および stdout ストリームにアクセスするためのメソッドを含むProcessstart()オブジェクトを返します。このオブジェクトは、必要な場所にリダイレクトできます。詳細については、この投稿をご覧ください。

于 2012-05-02T03:34:04.580 に答える