46

私はコンソールに開始されたOutputStreamのを取得しようとしています。これはどのように行うことができますか?Processexec()

不完全なコードは次のとおりです。

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.Reader;

public class RuntimeTests
{
    public static void main(String[] args)
    {
        File path = new File("C:\\Dir\\Dir2");
        String command = "cmd /c dir";
        Reader rdr = null;
        PrintStream prtStrm = System.out;
        try
        {
            Runtime terminal = Runtime.getRuntime();

            OutputStream rtm = terminal.exec(command, null, path).getOutputStream();
            prtStrm = new PrintStream(rtm);
            prtStrm.println();
        } 
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}
4

7 に答える 7

114

私は最近この問題に遭遇し、Java7以降プロセスビルダーAPIが拡張されたことに言及したいと思います。この問題は次の方法で解決できます。

ProcessBuilder pb = new ProcessBuilder("yourcommand");
pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
Process p = pb.start();
于 2012-08-30T15:26:59.310 に答える
44

私はこれがあなたが探しているものだと信じています:

  String line;
  Process p = Runtime.getRuntime().exec(...);
  BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
  while ((line = input.readLine()) != null) {
    System.out.println(line);
  }
  input.close();
于 2011-10-10T15:45:29.383 に答える
12

私は同様の問題に直面し、次のコードを使用しています。

Process p = Runtime.getRuntime().exec(".....");
p.waitFor();

String line;

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

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

input.close();

OutputStream outputStream = p.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.println();
printStream.flush();
printStream.close();
于 2012-10-16T09:00:49.497 に答える
7

Java7以降で利用可能なProcessBuilderAPIをカバーするBenjaminGruenbaumの回答を参照してください。

の後に発生するプロセス出力を読み取る新しいスレッドを開始する必要がありますProcess.waitFor()。次に、プロセス出力をそのスレッドからコンソールにコピーできます。

Process.getOutputStream()実際には入力、つまりプロセスへのstdinです。 プロセスのstdoutおよびstderrであるオブジェクトをProcess.getInputStream()返しProcess.getErrorStream()ます。とは、プロセスInputStreamの観点とは反対の、呼び出し元の観点からのものです。InputStreamOutputStream

プロセスの出力stdoutは呼び出し元に入力されるため、呼び出し元はを取得し、getInputStream()そこからstdoutを読み取ります。

Process proc = Runtime.getRuntime().exec(cmdArr, env, cwdir);

InputStreamReader isr = new InputStreamReader(proc.getInputStream());
BufferedReader rdr = new BufferedReader(isr);
while((line = rdr.readLine()) != null) { 
  System.out.println(line);
} 

isr = new InputStreamReader(proc.getErrorStream());
rdr = new BufferedReader(isr);
while((line = rdr.readLine()) != null) { 
  System.out.println(line);
} 
rc = proc.waitFor();  // Wait for the process to complete

Process.getOutputStream()呼び出し元がデータをプロセスのstdinに「出力」するために使用されます。このコードは、上記の例の最初の行で「proc」が作成された後に追加して、プロセスのstdinにデータを送信できます。

// Send data to stdin of the process (in development, needs input content)
OutputStream os = proc.getOutputStream();
Bytes content = new Bytes("Hello\nasdf\n adma");
os.write(content.arr, content.off, content.length());
os.close(); // should use try/finally or try/resource

出力を読み取る前に、上記を実行してください。OSを閉じることを忘れないでくださいOutputStream(try/resourceまたはtry/finalのいずれかを使用して)。したがって、プロセスはstdinが完了したことを認識し、情報の処理を終了できます。

于 2010-10-14T17:56:59.357 に答える
5

私はこれが非常に古い質問であることを知っていますが、上記の答えのより良い代替案は

ProcessBuilder builder = new ProcessBuilder(command);
builder.inheritIO();
Process p = builder.start();

のドキュメントからProcessBuilder.inheritIO()

サブプロセスの標準I/Oのソースと宛先を、現在のJavaプロセスのものと同じになるように設定します。

これが誰かに役立つことを願っています!

于 2019-06-09T12:21:15.583 に答える
2

jcabi-logVerboseProcessからお試しください:

String output = new VerboseProcess(new ProcessBuilder("foo.bat")).stdout();

クラスはバックグラウンドスレッドを開始し、出力ストリームをリッスンしてログに記録します。

于 2013-06-22T10:50:41.880 に答える
2

commons-ioのorg.apache.commons.io.IOUTilsを使用できる場合は、

System.out.println(IOUtils.toString(process.getInputStream()));
System.err.println(IOUtils.toString(process.getErrorStream()));
于 2016-02-15T17:20:03.100 に答える