【问题标题】:Getting Output from the java process从java进程获取输出
【发布时间】:2016-03-03 06:08:22
【问题描述】:

我正在构建一个 javaFx 应用程序我正在使用 java 进程构建器类运行一个命令。

ProcessBuilder builder = new ProcessBuilder(runCommand);
builder.redirectErrorStream(true);
Process process = builder.start();
try {
    process.waitFor();
} catch (InterruptedException e) {
    e.printStackTrace();
}

我正在尝试从我尝试了两种不同方法的过程中获取输出,但我无法获得它。

InputStream stdout = process.getInputStream();
InputStream stderr = process.getErrorStream ();
BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));
String line1=null;
while ((line1 = reader.readLine()) != null) {
    System.out.println(line1);
}
BufferedReader errorred = new BufferedReader (new InputStreamReader(stderr));
while ((line1 = errorred.readLine()) != null) {
    System.out.println(line1);
}

我也试过这个:

ProcessBuilder builder = new ProcessBuilder(runCommand);
//String outputLogs = new VerboseProcess(new ProcessBuilder(""));
builder.redirectErrorStream(true);
builder.redirectOutput(Redirect.INHERIT);
builder.redirectError(Redirect.INHERIT);
builder.redirectInput(Redirect.INHERIT);
Process process = builder.start();
try {
    process.waitFor();
} catch (InterruptedException e) {
    e.printStackTrace();
}

【问题讨论】:

  • 你能不能试试我的回答中的 sn-p 并在你的机器上检查结果。

标签: java javafx javafx-2


【解决方案1】:

我相信错误出在其他地方。以下 sn-p 是基于您发布的代码

ProcessBuilder builder = new ProcessBuilder("java.exe", "-version");
builder.redirectErrorStream(true);
Process process = builder.start();
process.waitFor();
int exitValue = process.exitValue();
System.out.println("exitValue = " + exitValue);

InputStream stdout = process.getInputStream();
InputStream stderr = process.getErrorStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
String line1 = null;
while ((line1 = reader.readLine()) != null) {
    System.out.println(line1);
}
BufferedReader errorred = new BufferedReader(new InputStreamReader(stderr));
while ((line1 = errorred.readLine()) != null) {
    System.out.println(line1);
}

并在控制台上产生以下输出

exitValue = 0
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)

如果new ProcessBuilder(command...) 中指定的命令不存在或不在PATH 中,则抛出IOException

Cannot run program "...": CreateProcess error=2, The system \
    cannot find the file specified

如果你没有得到任何输出。原因可能如下:

  • 该进程没有向 stdout/stderr 打印任何内容
  • 您的runcommand 在后台进程中启动进程,例如在 Linux/OSX 上 command & 或在 Windows 上 start command.exe

【讨论】:

  • 这是为我提供输出,但如果我替换 new ProcessBuilder("java.exe", "-version");使用新的 ProcessBuilder(运行命令);并运行它不提供任何东西。那么我是否应该更改我的 ProcessBuilder 参数中的某些内容以返回输出。即使命令有问题,它不应该给出一些错误消息吗??
  • @user3649361 我已经更新了我的答案。添加带有exitCode 的部分以查看您启动的进程返回哪个退出代码。
  • 我没有得到任何输出,似乎进程正在后台启动,如何解决这个问题??
  • @user3649361 发布runcommand 的值确保私有数据可以替换为虚拟值,但语法与您使用时相同。
  • 对不起,我没听明白,你想说什么??
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2021-04-15
  • 2015-06-08
相关资源
最近更新 更多