Java应用程序如何从Java / Scala中生成新的交互式应用程序(例如命令行编辑器)?
当我使用Runtime.getRuntime().exec("vim test")
时,我只会获得一个Process实例,而vim
将在后台运行;而不是出现在用户身上。
答案 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();