产生一个互动过程

时间:2010-05-17 15:51:14

标签: java scala process spawn

Java应用程序如何从Java / Scala中生成新的交互式应用程序(例如命令行编辑器)?

当我使用Runtime.getRuntime().exec("vim test")时,我只会获得一个Process实例,而vim将在后台运行;而不是出现在用户身上。

5 个答案:

答案 0 :(得分:4)

您必须使用System.console()

包装输入和输出编写器

您必须手动将每个输入重定向到生成的进程,并将每个输出重定向到用户。

答案 1 :(得分:0)

假设你在linux上,你实际上必须在新的终端窗口中运行命令

Runtime.getRuntime().exec(new String[]{"xterm", "-e", "vim test"});

答案 2 :(得分:0)

MMMMM。试试这个:

scala.sys.Process("vim test").run(true)

哎呀,那只是在Scala主干上 - 可能是Scala 2.9。

答案 3 :(得分:0)

注意:当您绝对需要有vim需要的终端/控制台时,您应该使用此方法。对于所有其他用途,请使用Runtime.exec()。

我刚遇到同样的问题。我已经开始工作的是使用Java Native Interface来调用一个执行系统调用的小型c函数:

SystemProcess.java:

class SystemProcess {
  public native int systemCall(String cmd);
  public boolean execute() { return systemCall("vim test") == 0; }
  static { System.loadLibrary("SystemProcess"); }
}

SystemProcess.c

#include [javah-generated-header.h]
[javah-generated-function-prototype] (JNIEnv *env, jobject obj, jstring jcmd) {
  jboolean iscopy;
  const char *cmd = (*env)->GetStringUTFChars(env, jcmd, &iscopy);
  jint ec = system(cmd);
  (*env)->ReleaseStringUTFChars(env, jcmd, cmd);
  return ec;
}

我将告诉你如何实际执行所有标头生成和c编译到共享库。如果它让你感觉更好,可以随意用fork / exec或posix_spawn替换系统。但是在大多数情况下,这应该在unix / linux上按原样运行。

答案 4 :(得分:0)

在1.7中,这是非常直截了当的。 (当然,一切都是你以前解决过的)

ProcessBuilder builder = new ProcessBuilder("/usr/bin/vim");
Map<String, String> environ = builder.environment();
builder.redirectInput(ProcessBuilder.Redirect.INHERIT);
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
final Process process = builder.start();
process.waitFor();