The*_*olf 37 java runtime stream runtime.exec printstream
我正在尝试OutputStream将Process启动者exec()发送到控制台.如何才能做到这一点?
这是一些不完整的代码:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*aum 104
我最近遇到了这个问题,只是想提一下,自java 7以来,进程构建器api已经扩展.现在可以通过以下方法解决此问题:
ProcessBuilder pb = new ProcessBuilder("yourcommand");
pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
Process p = pb.start();
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助 :)
Sti*_*ens 38
我相信这就是你要找的东西:
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();
Run Code Online (Sandbox Code Playgroud)
小智 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();
Run Code Online (Sandbox Code Playgroud)
请参阅 Benjamin Gruenbaum 回答涵盖自 Java 7 以来可用的 ProcessBuilder API。
您需要启动一个新线程来读取Process.waitFor(). 然后可以从该线程将进程输出复制到控制台。
Process.getOutputStream()实际上是输入,即进程的标准输入。 Process.getInputStream()并Process.getErrorStream()返回InputStream作为进程的 stdout 和 stderr 的对象。的InputStreamS和OutputStream来自呼叫者的角度来看,这是该过程的角度相反。
进程的输出 stdout 是调用者的输入,因此调用者获取 agetInputStream()并从中读取 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
Run Code Online (Sandbox Code Playgroud)
Process.getOutputStream()用于调用者将数据“输出”到进程的标准输入中。可以在上面示例的第一行中创建 '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
Run Code Online (Sandbox Code Playgroud)
在读取输出之前执行上述操作。请记住关闭OutputStream操作系统(使用 try/resource 或 try/finally)。因此,该过程知道 stdin 已完成,并且可以完成对信息的处理。
我知道这是一个非常古老的问题,但上述答案的更好替代方案是
ProcessBuilder builder = new ProcessBuilder(command);
builder.inheritIO();
Process p = builder.start();
Run Code Online (Sandbox Code Playgroud)
从文档中ProcessBuilder.inheritIO(),
将子进程标准 I/O 的源和目标设置为与当前 Java 进程的源和目标相同。
希望这可以帮助某人!