2

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

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

4

5 回答 5

4

您将不得不使用包装输入和输出编写器System.console()

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

于 2010-05-17T16:32:47.903 回答
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();
于 2014-11-04T11:14:05.763 回答
0

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

Runtime.getRuntime().exec(new String[]{"xterm", "-e", "vim test"});
于 2010-05-17T16:05:23.523 回答
0

嗯。尝试这个:

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

糟糕,这只是在 Scala 主干上——可能是 Scala 2.9。

于 2011-01-21T21:13:18.800 回答
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"); }
}

系统进程.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 上按原样工作。

于 2011-02-18T19:47:38.037 回答