Порождение интерактивного процесса - PullRequest
2 голосов
/ 17 мая 2010

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

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

Ответы [ 5 ]

4 голосов
/ 17 мая 2010

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

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

0 голосов
/ 04 ноября 2014

В 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();
0 голосов
/ 18 февраля 2011

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

У меня была такая же проблема. Я начал использовать собственный интерфейс Java для вызова небольшой функции 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.

0 голосов
/ 22 января 2011

ммммм. Попробуйте это:

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

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

0 голосов
/ 17 мая 2010

Если вы работаете в linux, вам действительно нужно запустить команду в новом окне терминала

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