Java 应用程序如何从 Java/Scala 生成新的交互式应用程序(例如命令行编辑器)?
当我使用时Runtime.getRuntime().exec("vim test")
,我只会得到一个 Process 实例,而vim
会在后台运行;而不是出现在用户面前。
您将不得不使用包装输入和输出编写器System.console()
您必须手动将每个输入重定向到生成的进程,并将每个输出重定向到用户。
在 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();
假设您在 linux 上,您实际上必须在新的终端窗口中运行命令
Runtime.getRuntime().exec(new String[]{"xterm", "-e", "vim test"});
嗯。尝试这个:
scala.sys.Process("vim test").run(true)
糟糕,这只是在 Scala 主干上——可能是 Scala 2.9。
注意:只有当你绝对需要一个终端/控制台时,你才应该使用这个方法,比如 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 上按原样工作。