2

Java アプリケーションは、Java/Scala から新しい対話型アプリケーション (コマンド ライン エディタなど) をどのように生成できますか?

を使用するRuntime.getRuntime().exec("vim test")と、Process インスタンスのみが取得vimされ、バックグラウンドで実行されます。ではなく、ユーザーに表示されます。

4

5 に答える 5

4

を使用して入力ライターと出力ライターをラップする必要がありますSystem.console()

すべての入力を生成されたプロセスに、すべての出力をユーザーに手動でリダイレクトする必要があります。

于 2010-05-17T16:32:47.903 に答える
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 でそのまま動作するはずです。

于 2011-02-18T19:47:38.037 に答える
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 に答える