Obtenez de l'Invite de Commande de Sortie de Chaîne de caractères En Java
J'ai besoin d'une méthode java qui va lire l'invite de commande de sortie, et le stocker dans une Chaîne de caractères à lire en Java.
C'est ce que j'ai jusqu'à présent mais qui ne fonctionne pas bien.
public void testGetOutput() {
System.out.println("\n\n****This is the testGetOutput Method!****");
String s = null;
String query = "dir " + this.desktop;
try {
Runtime runtime = Runtime.getRuntime();
InputStream input = runtime.exec("cmd /c " + query).getInputStream();
BufferedInputStream buffer = new BufferedInputStream(input);
BufferedReader commandResult = new BufferedReader(new InputStreamReader(buffer));
String line = "";
try {
while ((line = commandResult.readLine()) != null) {
s += line + "\n";
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}//end testGetOutput()
Je pense que le problème est lorsque je tente de changer la requête à une commande qui va exécuter les HandBrakeCLI.exe. En regardant mon système lorsque le programme est en cours d'exécution (mais semble avoir mis en pause), il me montre que HandBrakeCLI.exe est en cours d'exécution en vertu d'une fenêtre cmd qui est en cours d'exécution en vertu de mon IDE. Tout ce qui fait sens, mais l'HandBrakeCLI.exe n'est pas sortie, donc je suppose que c'est pourquoi je ne peux pas lire la sortie que de l'entrée de mon programme.
Donc, après que l'arrière-plan. Ma grande question est: Comment puis-je obtenir HandBrakeCLI.exe pour fermer, après c'est fini avec ma requête afin que je puisse obtenir sa sortie?
Juste pour la petite info, la seule différence entre la méthode ci-dessus et l'analyse de DVD méthode que j'ai pour HandBrakeCLI est la variable de requête est différent. Comme dans cet exemple:
String query = "C:\Users\Kent\Desktop\HBCLI\HandBrakeCLI -t --scan -i "C:\Users\Kent\Desktop\General Conference DVDs\Sources74th October 2004\DVD 1"; //this is actually a variable in the DVD object, but here's an example'
Oh, et par la manière, lorsque j'exécute cette requête dans une invite de commande, c'est exactement ce que je veux, de me donner toute la sortie j'ai désespérément envie!
Voici le problème d'origine (je ne suis pas sûr de la façon de soumettre à nouveau une question):
J'ai cherche partout et ne peut pas comprendre cela. Je ne suis pas sûr de ce que j'ai trouvé est même pertinent, de ce que je veux faire. Je n'ai pas beaucoup de code pour cela encore, alors il l'habitude de faire beaucoup pour mettre le code ici et je pense que cela doit être assez simple, donc je vais vous donner quelques captures d'écran ici. Voici donc ma tâche:
-
Analyser un dossier qui est plein de DVD extrait des dossiers (dossiers Video_TS avec les fichiers VOB etc.) et de stocker ces noms de dossiers comme le titre du DVD.
-
L'analyse de chaque dossier à l'aide de la HandBrakeCLI et stocker le résultat dans une chaîne.
-
Regex de la chaîne d'identifier chaque titre, chapitre, et de la langue.
-
Générer des requêtes de donner en retour à HandBrakeCLI en vrac coder chaque langue dans chaque chapitre dans chaque titre pour chaque DVD (vous pouvez voir pourquoi je veux automatiser cela!)
-
Stocker ces requêtes dans un *.fichier bat
La seule partie que je ne suis pas sûr à ce sujet est l'étape 2! Je ne peux rien faire d'autre assez facilement. J'ai lu beaucoup de choses sur OutputStreams, mais je n'arrive pas à comprendre comment il fonctionne. J'ai vraiment besoin juste pour obtenir la sortie d'une chaîne de caractères qui je peux regex pour récupérer les trucs dont j'ai besoin. Voici les captures d'écran de ce que j'ai besoin d'intrants et de ce que j'ai besoin de bande à partir de la sortie:
D'entrée à HandBrakeCLI:
Sortie de numérisation:
OriginalL'auteur kentcdodds | 2011-10-03
Vous devez vous connecter pour publier un commentaire.
D'abord vous avez besoin d'un non-blocage de la lecture de
Standard.out
etStandard.err
Alors vous avez besoin de cravate de cette classe dans les
InputStream
etOutputStream
objets.C'est à peu près la chaudière de la plaque que j'utilise quand j'ai besoin de
Runtime.exec()
rien en Java.Une manière plus avancée serait d'utiliser
FutureTask
etCallable
ou au moinsRunnable
, plutôt que de les étendreThread
qui n'est pas la meilleure pratique.REMARQUE:
La
@Nonnull
annotations sont dans le JSR305 de la bibliothèque. Si vous utilisez Maven, et que vous utilisez Maven n'est-ce pas, il suffit d'ajouter cette dépendance à votrepom.xml
.Parfait! Je ne suis pas sûr de savoir exactement comment il fonctionne. Mais je vais regarder un peu pour le comprendre. Mais ouais, il a travaillé comme un charme! Maintenant j'ai juste à regex tout ça! En tout cas, merci une tonne pour votre aide! Oh, et je ne suis pas sûr de ce que Maven est. Mon IDE est de Netbeans. Je n'ai pas besoin d'ajouter le <dépendance> trucs. Merci encore!
OriginalL'auteur
Cet exemple de programme Java s'exécute la commande "dir' (liste de répertoire) sur la ligne de commande et tire le résultat dans une Chaîne de caractères et l'imprime sur la console.
Sur Windows, c'est le résultat-je obtenir
OriginalL'auteur Eric Leschinski
En supposant que vous utilisez
Runtime.exec()
pour commencer votre processus externe, vous donnant unProcess
objet, il y a trois méthodes pertinentes sur cet objet:getOutputStream()
,getInputStream()
, etgetErrorStream()
.Je pense qu'il est facile de se confondre à propos de ces -- vous pensez probablement que vous voulez voir le processus de production, et donc un "flux de sortie" est ce que vous voulez. Mais la chose que vous devez retenir, c'est que le nom de ces objets est à partir du code Java du point de vue-un OutputStream est pour Java pour écrire la sortie de, tout un InputStream est pour Java pour lire l'entrée. La sortie de votre processus externe, de Java, d'entrée.
Donc vous l'utiliser
getInputStream()
et appel de méthodes appropriées sur laInputStream
retournés par elle pour lire la sortie. Vous pouvez aussi utilisergetErrorStream()
pour s'assurer que vous ne manquez rien parce que c'est écrit d'erreur standard.Une question, je pense, c'est que
exec()
s'attend à une réelle exécutable -- un fichier de commandes n'est pas un programme exécutable, c'est une série de commande doit être exécutée par le shell Windows. Voir stackoverflow.com/questions/615948/....Nous sommes vraiment très proche! Alors maintenant, mon problème, c'est mon tampon reader objet est null. Je ne sais pas pourquoi. J'ai mis à jour le code sur le collabedit doc. Vous remarquerez que j'ai mis println autour de la commandResult parce que c'est là que le code s'arrête, et commandResult.readLine() = null quand il doit être égale à la première ligne d'entrée (ou au moins, c'est ce que je suis à la recherche d'). Merci encore pour l'aide! collabedit.com/5r384
Ah, je pense que le problème est l'utilisation de
start
dans la commande externe, que je n'avais pas penser quoi que ce soit quand je vous appelle à l'autre réponse. Qui ouvre une nouvelle fenêtre de commande, où la sortie de la commande sera écrit -- donc il ne va pas à la sortie standard de la réelle cmd processus. Essayez de supprimerstart
de la commande, par exemplecmd /c path-to-batch-file.bat
.Je ne peux pas le croire. Ça ne marche toujours pas. commandResult.readLine() est simplement la lecture de la commande plutôt que de la sortie de la commande. (par exemple, si la commande "dir" puis commandResult.readLine() retourne "dir" au lieu de ce que la sortie de la commande "dir" est). Est-il de toute façon pour moi de le convertir en ce que la sortie de cette commande serait dans une chaîne de caractères? Voici la mise à jour de code: collabedit.com/5r384 encore une fois Merci à tous pour votre aide Dave! Je sais que quelqu'un de plus intelligent que moi pourrait le faire! J'espère que je vais obtenir de bons à cela et être capable de contribuer à stackoverflow dans de bonnes façons 🙂
OriginalL'auteur Dave Costa