anticipation
Se connecter avec
S'enregistrer | Connectez-vous
Votre question

redirection du résultat d'une commande shell en Java

Tags :
  • Java
  • Programmation
Dernière réponse : dans Programmation
Partagez
5 Mai 2006 15:24:01

Bonjour à tous,

j'ai un problème qui peut sembler idiot mais qui pourtant me préoccupe depuis un bon moment.

Je voudrais pouvoir, dans un programme java, exécuter une commande shell (en fait un autre programme mais pour simplifier disons la commande "ls") et récupérer son résultat dans un fichier au format texte.

Pour exécuter la commande, j'ai vu partout qu'il faut utiliser:

Process proc = Runtime.getRuntime().exec("ls /path du fichier/);

Pour en récupérer la sortie, on m'a parlé de rediriger la sortie standard vers un fichier, ce que j'ai fait.
Ca fonctionne pour des simples "println", mais je n'arrive pas à récupérer ce qui m'intéresse, à savoir le résultat de ma commande.

J'ai aussi essayé avec des OutputStream:

Process proc = Runtime.getRuntime().exec("ls /path du fichier/);
OutputStream out = proc.getOutputStream();

mais là je ne sais pas quoi faire de out.

Pourriez-vous m'aider pleazzzzzzzzzzzzz

Autres pages sur : redirection resultat commande shell java

5 Mai 2006 18:39:59

Tu peux faire ça:
  1. Process proc = Runtime.getRuntime().exec("ls /path/ > /tmp/resultat.txt");

C'est la redirection dans un fichier en shell
Si tu veux aussi rediriger les erreurs, remplace le > par &>
5 Mai 2006 18:43:31

Tu penses bien que c'est la première chose que j'ai essayée.
Mais ca ne fonctionne pas. Ne me demande pas pourquoi...
Contenus similaires
Pas de réponse à votre question ? Demandez !
5 Mai 2006 20:47:27

J'ai testé ceci:

  1. import java.io.FileNotFoundException;
  2. import java.io.FileOutputStream;
  3. import java.io.PrintStream;
  4.  
  5. public class Redirect {
  6.  
  7.  
  8. public static void main(String[] args) {
  9. try {
  10. System.setErr(new PrintStream(new FileOutputStream("/home/moi/Desktop/stderr.txt")));
  11. System.setOut(new PrintStream(new FileOutputStream("/home/moi/Desktop/stdout.txt")));
  12.  
  13. try{
  14. Runtime.getRuntime().exec("ls /home/moi/Desktop);
  15. }
  16. catch (Exception e) {
  17. }
  18. }
  19. catch (FileNotFoundException e) {
  20. e.printStackTrace();
  21. }
  22.  
  23. }
  24.  
  25. }


Je ne reçois ni message d'erreur ni résultat.
Lorsque j'essaye un print(), je reçois qq chose du style "java.lang.ConcreteProcess@2fd58" dans le fichier out.
5 Mai 2006 22:29:17

Je crois que c'est équivalent à ce que j'ai fait.
Mon code fonctionne pour de bêtes print comme ceux que tu montres, mais pas avec le résultat d'une commande externe à java.

Mais c'est gentil d'avoir essayé de m'aider
5 Mai 2006 22:39:36

Au fait, tu as vraiment besoin de passer par exec() ?
Parce que si c'est juste pour lister les fichiers, tu peux utiliser la classe java.io.File
et plus particulièrement les méthodes isDirectory() et listFiles()
Sinon, la redirection ne marche pas avec '>' car c'est pas une commande shell que l'on donne mais un programme avec ses paramètres. Donc au pire, tu peux faire un script shell qui, lui redirige la sortie dans un fichier.
Ou alors exécuter un shell avec "sh" ou "bash" puis rediriger le stdin pour y envoyer les commandes en simulant le clavier avec setIn() (donc tu ourrais faire le ls > fichier).
5 Mai 2006 22:50:38

Non la commande ls était juste un exemple.

Si tu veux savoir ce que je dois faire exactement je t'explique:

Mon programme java consiste en une interface graphique qui propose à l'utilisateur de créer une sorte de graphe (pour simplifier). Il peut donc entrer autant de graphes, avec autant de noeuds et d'arrêtes qu'il veut ainsi que toutes les propriétés qui vont avec.
Ensuite, pour chacun des graphes entrés, le programme crée un fichier graph1.hy, graph2.hy... structuré et formatté selon les normes d'un certain logiciel.
La partie qui coince est celle où, pour chaque fichier graphi.hy créé, j'appelle ce logiciel avec ce fichier en paramètre (ca c'est ma commande) et je suis censée récupérer le résultat de chaque exécution dans un fichier graphi.log

Voila exactement ce que je dois faire.

lorsque je lance le logiciel en ligne de commande, la redirection "> fichier.log" fonctionne, mais pas quand je la lance à partir de Java

Voila, je ne sais pas si ça t'a éclairé. En tout cas merci
8 Août 2007 11:03:55

(Probablement inutile pour le problème original, certainement résolu depuis, mais ca peut servir pour les gens qui rencontrent le même problème par la suite...)

Sorti de l'API de la classe Process :

Citation :
The methods that create processes may not work well for special processes on certain native platforms, such as native windowing processes, daemon processes, Win16/DOS processes on Microsoft Windows, or shell scripts. The created subprocess does not have its own terminal or console. All its standard io (i.e. stdin, stdout, stderr) operations will be redirected to the parent process through three streams (getOutputStream(), getInputStream(), getErrorStream()). The parent process uses these streams to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.


En gros, la commande n'a pas son propre terminal et utilise des flots d'entrée et de sortie standard qui ne sont pas ceux de la console...

Une solution possible peut être trouvée à l'adresse suivante :

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4057581
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS