web-dev-qa-db-ja.com

ランタイムexec()OutputStreamをコンソールに出力

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

不完全なコードを次に示します。

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();
        }
    }
}
35
TheWolf

Process.waitFor()を呼び出した後、端末出力ストリームを読み取り、コンソールにコピーする新しいスレッドを開始する必要があります。

1
Eugene Kuleshov

私は最近この問題に遭遇し、Java 7以降 process builder api が拡張されました。この問題は次の方法で解決できます。

ProcessBuilder pb = new ProcessBuilder("yourcommand");
pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
Process p = pb.start();

これが役立つことを願っています:)

99

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

  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();
37
Stijn Geukens

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

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();
12
samaitra

VerboseProcess from jcabi-log を試してください:

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

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

2
yegor256

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

System.out.println(IOUtils.toString(process.getInputStream()));
System.err.println(IOUtils.toString(process.getErrorStream()));
1
radiantRazor

これは非常に古い質問ですが、上記の回答のより良い代替案は

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

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

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

これが誰かを助けることを願っています!

1
Mohamed Anees A