J'ai besoin d'une méthode Java qui lira la sortie d'invite de commande et le stockera dans une chaîne à lire dans Java.
C'est ce que j'ai jusqu'à présent mais ne fonctionne pas correctement. P>
String query = "C:\Users\Kent\Desktop\HBCLI\HandBrakeCLI -t --scan -i "C:\Users\Kent\Desktop\General Conference DVDs\Sources\174th October 2004\DVD 1"; //this is actually a variable in the DVD object, but here's an example'
3 Réponses :
En supposant que vous utilisez Je pense qu'il est facile de se confondre à ce sujet - vous pensez probablement que vous souhaitez voir la sortie du processus, donc un "flux de sortie" est donc ce que vous voulez. Mais la chose dont vous avez besoin de rappelez-vous, c'est que la nommée de ces objets est du point de vue du code Java - une sortie de sortie est destinée à Java d'écrire une sortie à la sortie, tandis qu'un INPUTStream est destiné à Java de lire entrée. La sortie de votre processus externe est du point de vue de Java, entrée. P>
Vous utiliseriez donc runtime.exeec () code> Pour démarrer votre processus externe, vous donnez un objet
processus code>, il existe trois méthodes pertinentes sur cet objet:
getOutputStream () code>,
getInputtream () code> et
getterRorStream () code>. p>
getinputtream () code> et appelez les méthodes appropriées sur le
INPUTStream code> renvoyé par celui-ci pour lire la sortie. Vous pouvez également utiliser
getterRorStream () code> pour vous assurer de ne rien manquer car il est écrit à une erreur standard. P>
Merci pour la clarification! C'était un peu déroutant. Le problème que je suis confronté est au lieu d'imprimer les résultats de la requête (comme on le voit dans ma deuxième capture d'écran), il imite la requête elle-même. Il y a trop de contenu dans le code pour ajouter à un commentaire ici, voici un lien vers une relation collaborée: collabedit.com/5r384
Je pense que exec () code> attend un exécutable réel - Un fichier de commandes ne constitue pas un programme exécutable, il s'agit d'une série de commandes à exécuter par la coque Windows. Voir
Nous devons vraiment fermer! Alors maintenant, mon problème est mon objet de lecture tampon est NULL. Je ne suis pas sûr de savoir pourquoi. J'ai mis à jour le code sur la DOC collaborée. Vous remarquerez que j'ai mis en place Println autour du CommandResult, car c'est là que le code pause et commandeResult.readline () = null quand il devrait être égal à la première ligne d'entrée (ou au moins, c'est ce que je recherche). Merci encore pour votre aide! collabedit.com/5r384
Ah, je pense que le problème est l'utilisation de Démarrer code> dans la commande externe, que je n'ai rien pensé de quand je vous ai référé à l'autre réponse. Cela ouvre une fenêtre de commande distincte, où la sortie de la commande sera écrite - il ne se passe donc pas sur la sortie standard du processus CMD actuel. Essayez de supprimer
Démarrer code> à partir de la commande, par exemple.
CMD / C Path-to-Batch-File.bat code>.
Je ne peux pas y croire. Cela ne fonctionne toujours pas. CommandResult.Readline () ne fait que lire la commande plutôt que la sortie de la commande. (comme si la commande était "dir", alors CommandResult.readline () renvoie "Dir" au lieu de la sortie de la commande "Dir"). Y a-t-il un moyen pour moi de convertir quelle serait la sortie de cette commande dans une chaîne? Voici le code mis à jour: collabedit.com/5r384 Merci encore pour toute votre aide Dave! Je sais que quelqu'un plus intelligent que moi pourrais faire ça! J'espère que je vais aller bien à cela et pouvoir contribuer à Stackoverflow de bonne manière :)
Une autre chose qui peut être utile est que le code s'arrête dans la boucle tandis que: tandis que ((ligne = commandResult.readline ())! = Null) {...} code> {...} il va courir bien (un peu ) Pour quelques itérations (suffisamment pour imprimer toutes les commandes du fichier * .bat), elle s'arrêtera (même lors du débogage, et il ne jette pas les erreurs, il ne va pas passer à autre chose) et NetBeans me dit qu'il est toujours en marche . Je ne sais pas quel est le problème.
Eh bien, maintenant je l'ai donc de sorte que cela ne va même pas dans la boucle tandis que le 'CommandResult.readline ()' est vraiment NULL, donc il passe complètement sur la boucle. J'ai mis à jour le code ... collabedit.com/5r384
Tout d'abord, vous avez besoin d'une manière non bloquante à lire depuis alors vous devez Attachez cette classe dans le standard.out code> et
standard.err code>
InputStream code> et
OUTPUTStream code> Objets. P>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>1.3.9</version>
</dependency>
Jarrod, merci pour la réponse rapide! Je vais essayer de mettre en œuvre cela tout de suite et vous permettra de savoir comment ça se passe!
Parfait! Je ne suis pas vraiment sûr de savoir comment ça marche. Mais je vais regarder un peu pour le comprendre. Mais oui, ça a fonctionné comme un charme! Maintenant, je dois juste regener tout ce genre de choses! Quoi qu'il en soit, merci une tonne pour votre aide! Oh, et je ne suis pas sûr de ce qu'est Maven. Mon IDE est Netbeans. Je n'avais pas besoin d'ajouter les choses
Cet exemple de programme Java complet exécute la commande 'dir' (liste de répertoires) sur la ligne de commande et tire le résultat dans une chaîne et l'imprime sur la console. strong> sous Windows, c'est le résultat que je reçois p>
+1 pour afficher une autre solution réalisable pour les générations à venir.