2010-05-17 3 views
2

Как приложение Java может создавать новое интерактивное приложение (например, редактор командной строки) из Java/Scala?Нерест интерактивного процесса

Когда я использую Runtime.getRuntime().exec("vim test"), я получаю экземпляр процесса, а vim будет работать в фоновом режиме; а не появляться пользователю.

ответ

0

Предполагая, что вы находитесь на Linux вы на самом деле нужно выполнить команду в новом окне терминала

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

Спасибо, но я надеялся запустить приложение на том же терминале. – notnoop

+1

Это предполагает, что ваш Java-код имеет управляющий терминал и стандартные привязки дескрипторов 0, 1 и 2. –

4

Вы должны обернуть входные и выходные писателей с использованием System.console()

Вам придется вручную перенаправить каждый ввод в процесс порождения и каждый выход для пользователя.

0

MMmmm. Попробуйте следующее:

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

Упс, это только на стволе Скалы - возможно, Scala 2.9.

0

Примечание: вы должны только использовать этот метод, когда вам абсолютно необходимо иметь терминал/консоль, например, что требуется виртуальному устройству. Для всех других целей перейдите к Runtime.exec().

У меня была такая же проблема. То, что я получил в работе использует Java Native Interface для вызова в небольшую функцию С, которая делает системный вызов:

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.

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(); 
Смежные вопросы