L'exécution de programme externe avec redirigé stdin et stdout de Java
Je suis en train de l'exécution d'un programme externe à partir d'un programme Java et je vais avoir des ennuis. Fondamentalement, ce que je voudrais faire est celle-ci:
Runtime.getRuntime().exec("./extprogram <fileIn >fileOut");
Cependant, j'ai trouvé que cela ne fonctionne pas - Java apparentls besoin d'utiliser un Process
avec l'entrée et les flux de sortie et d'autres choses dont je ne suis pas expérimenté avec.
J'ai regardé un certain nombre d'exemples dans l'internet (dont beaucoup sont de SI), et il ne semble pas être une norme simple façon de le faire, ce qui, pour quelqu'un qui n'est pas bien comprendre ce qu'il se passe, peut être très frustrant.
Je suis aussi de la difficulté à essayer de construire mon propre code de fermer les exemples d'autres personnes de code parce que généralement, il semble que la plupart des autres personnes 1. ne sont pas intéressés dans la réorientation stdin
, et 2. ne sont pas nécessairement rediriger stdout
à un fichier, mais au lieu de System.out
.
Donc, quelqu'un serait-il en mesure de me pointer dans la direction d'un bon de simples modèles de code pour l'appel externe des programmes et de rediriger les stdin
et stdout
? Merci.
OriginalL'auteur MattS | 2012-07-04
Vous devez vous connecter pour publier un commentaire.
Si vous devez utiliser
Process
, alors quelque chose comme cela devrait fonctionner:Remarque:
close
le fluxInput/OutputStreams
mise en œuvre peut copier un octet à la fois.cat
est l'exemple le plus simple avec les canalisations de I/O.MattS: j'ai mis à jour un peu le code, le plus tôt flux de manutention eu quelques problèmes (je n'ai pas jugé à propos de le ruisseau de la manipulation assez). Ces changements peuvent aider. Également ajouté quelques notes.
Super, je vais prendre un coup d'oeil un peu. Avec le code tel qu'il était avant, j'ai fait n'oubliez pas de fermer le flux d'entrées-sorties, mais j'ai oublié de fermer le processus du flux d'erreur, qui était " en provoquant une panne en raison d'un trop grand nombre de fichiers ouverts à la fois. Merci encore.
OriginalL'auteur pb2q
Vous pouvez essayer quelque chose comme ceci:
bp.redirectErrorStream(true)
.ProcessBuilder
n'a pas unredirectInput()
ou unredirectOutput()
fonction. docs.oracle.com/javase/1.5.0/docs/api/java/lang/...href="http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html" >docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html
Ah, je suis seulement sur la version 6 de Java. Malheureusement, la mise à niveau n'est pas une option pour le moment.
C'est malheureux. Il est sorti depuis presque un an maintenant, et il est assez de bataille testés. 🙁 espérons-le, une "vieille école", de façon que se présente!
OriginalL'auteur corsiKa
avez-vous essayé le Système.setIn et du Système.sera? a été autour depuis le JDK 1.0.
OriginalL'auteur Snake