exec()
によって開始されたOutputStream
のProcess
をコンソールに取得しようとしています。これをどのように行うことができますか?
不完全なコードを次に示します。
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();
}
}
}
Process.waitFor()を呼び出した後、端末出力ストリームを読み取り、コンソールにコピーする新しいスレッドを開始する必要があります。
私は最近この問題に遭遇し、Java 7以降 process builder api が拡張されました。この問題は次の方法で解決できます。
ProcessBuilder pb = new ProcessBuilder("yourcommand");
pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
Process p = pb.start();
これが役立つことを願っています:)
私はこれがあなたが探しているものだと信じています:
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();
私は同様の問題に直面し、次のコードを使用しています。
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();
VerboseProcess
from jcabi-log を試してください:
String output = new VerboseProcess(new ProcessBuilder("foo.bat")).stdout();
クラスはバックグラウンドスレッドを開始し、出力ストリームをリッスンし、ログに記録します。
Commons-ioのorg.Apache.commons.io.IOUTilsを使用できる場合、
System.out.println(IOUtils.toString(process.getInputStream()));
System.err.println(IOUtils.toString(process.getErrorStream()));
これは非常に古い質問ですが、上記の回答のより良い代替案は
_ProcessBuilder builder = new ProcessBuilder(command);
builder.inheritIO();
Process p = builder.start();
_
ProcessBuilder.inheritIO()
のドキュメントから、
サブプロセスの標準I/Oのソースと宛先を、現在のJavaプロセスと同じになるように設定します。
これが誰かを助けることを願っています!