8
votes

Obtenir une sortie d'invite de commande à la chaîne en Java

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'


0 commentaires

3 Réponses :


1
votes

En supposant que vous utilisez runtime.exeec () Pour démarrer votre processus externe, vous donnez un objet processus , il existe trois méthodes pertinentes sur cet objet: getOutputStream () , getInputtream () et getterRorStream () .

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.

Vous utiliseriez donc getinputtream () et appelez les méthodes appropriées sur le INPUTStream renvoyé par celui-ci pour lire la sortie. Vous pouvez également utiliser getterRorStream () pour vous assurer de ne rien manquer car il est écrit à une erreur standard.


7 commentaires

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 () 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 Stackoverflow.com/questions/615948/... .


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 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 à partir de la commande, par exemple. CMD / C Path-to-Batch-File.bat .


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) {...} {...} 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



5
votes

Tout d'abord, vous avez besoin d'une manière non bloquante à lire depuis standard.out code> et standard.err code> xxx pré>

alors vous devez Attachez cette classe dans le InputStream code> et OUTPUTStream code> Objets. P>

<dependency>
  <groupId>com.google.code.findbugs</groupId>
  <artifactId>jsr305</artifactId>
  <version>1.3.9</version>
</dependency>


2 commentaires

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 . Merci encore!



7
votes

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. xxx

sous Windows, c'est le résultat que je reçois xxx


1 commentaires

+1 pour afficher une autre solution réalisable pour les générations à venir.