Comment une application Java peut-elle générer une nouvelle application interactive (par exemple un éditeur de ligne de commande) à partir de Java/Scala? Lorsque j'utilise Runtime.getRuntime().exec("vim test")
, j'obtiendrais uniquement une instance Process, alors que vim
fonctionnerait en arrière-plan; plutôt que d'apparaître à l'utilisateur.Création d'un processus interactif
Répondre
En supposant que vous êtes sur Linux, vous avez fait pour exécuter la commande dans une nouvelle fenêtre de terminal
Runtime.getRuntime().exec(new String[]{"xterm", "-e", "vim test"});
Vous devrez envelopper les auteurs d'entrée et de sortie en utilisant System.console()
Vous devrez rediriger manuellement chaque entrée au processus engendré et chaque sortie à l'utilisateur.
MMmmm. Essayez ceci:
scala.sys.Process("vim test").run(true)
Oops, qui est seulement sur le tronc Scala - peut-être Scala 2.9.
Note: Vous devez seulement utiliser cette méthode lorsque vous devez absolument avoir un terminal/console comme ce qui exige vim. Pour toutes les autres utilisations, rendez-vous avec Runtime.exec().
Je viens d'avoir ce même problème. Ce que j'ai appris à travailler utilise Java Native Interface pour appeler dans une petite fonction c qui fait un appel système:
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;
}
Je vais vous laisser le soin de faire toute la génération de l'en-tête et la compilation de c dans la bibliothèque partagée. N'hésitez pas à remplacer le système par fork/exec ou posix_spawn si cela vous fait vous sentir mieux. Mais pour la plupart, cela devrait fonctionner comme sur unix/linux.
En 1,7, c'est assez simple. (Bien sûr, tout est quand vous l'avez résolu avant)
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();
- 1. Interactif interactif en perl
- 2. Invocation régulière d'un processus interactif (tests WatiN) via Task Scheduler
- 3. création de processus
- 4. Déclenchement de processus/création de processus Linux
- 5. Création d'un processus inter-processus EventWaitHandle
- 6. Création d'un processus sans élévation
- 7. Tableau interactif
- 8. Coquille interactif personnalisée
- 9. décodeur binaire interactif à structs
- 10. Terminal interactif dans VIM
- 11. Mode interactif dans matplotlib
- 12. Débogueur interactif Pylons UnboundExecutionError
- 13. 'svn add' interactif
- 14. Désassemblage interactif dans GDB
- 15. interactif google earth building
- 16. Scp non interactif
- 17. dessin de courbe interactif
- 18. Interactif cmd.exe dans Windows
- 19. Fichier batch interactif
- 20. Création d'un pointeur de fonction inter-processus
- 21. .net C#: Création d'un processus asynchrone
- 22. Création de processus masqués (fenêtre non visible)
- 23. Problèmes avec le plan interactif
- 24. Objet 3D interactif dans Surface
- 25. Séparateur interactif d'arbres de décision
- 26. script de démarrage R interactif
- 27. logiciel de cd-rom interactif
- 28. Tutoriel F # interactif shell (fsi)?
- 29. Création d'un diagramme à barres interactif à partir des données Google Analytics
- 30. A la recherche d'un utilitaire interactif pour la création de grammaires analyseur sans contexte
Merci, mais j'espérais lancer l'application sur le même terminal. – notnoop
Cela suppose que votre code Java dispose d'un terminal de contrôle et des liaisons standard des descripteurs 0, 1 et 2. –