IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

Changer le dossier courant utilisé par le shell sous linux


Sujet :

API standards et tierces Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut Changer le dossier courant utilisé par le shell sous linux
    Bonjour,

    Je cherche à exécuter des commandes shell sous linux, à partir d'un programme java.

    J'ai pu le faire grâce au code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    try {
                    Process process = Runtime.getRuntime().exec(command);
                    InputStream inputstream = process.getInputStream();
     
                    InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
                    BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
                    String line;
                    String output = "";
                    while ((line = bufferedreader.readLine()) != null) {
                        output = output + "\n" + line;
                    }
     
                terminal terminalWindow = new terminal(output);
                terminalWindow.setVisible(true);
                } catch (IOException ex) {
                    Logger.getLogger(mainWindow.class.getName()).log(Level.SEVERE, null, ex);
                    errorMessage errorMessageWindow = new errorMessage(this, true, ex.toString());
                    errorMessageWindow.setVisible(true);
                }
    Le problème est que si j'execute un programme à partir du shell, qui enregistre un fichier dans le répertoire courant, il est sauvegardé dans le home si j'ai lancé le par l'interface graphique; et dans le répertoire du .jar si je l'ai lancé depuis un terminal.

    Je voudrais laisser le choix à l'utilisateur de l'emplacement pour enregistrer ce fichier, et il faudrait donc que je puisse changer le répertoire courant utilisé par le shell.

    J'ai essayé les deux méthodes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    try {
                    Process process = Runtime.getRuntime().exec("cd /chemin/fichier;" + command);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    File f = new File("/home/sylvain/Desktop/test");
                if (!(f.exists())){
                        if (!(f.mkdir()))
                                System.err.println("Cannot create the new folder!");
                }	
     
                //Change current folder
                System.setProperty("user.dir", "/chemin/fichier");
    Dans le premier cas, j'ai une exception :
    java.io.IOException: Cannot run program "cd": java.io.IOException: error=2, No such file or directory
    Il semble qu'il ne comprend pas la commande cd.

    Dans le deuxième cas, le dossier est bien créé si il n'existe pas, et System.getProperty("user.dir") renvoie bien la valeur que j'ai donné en paramètre, mais le fichier créé est toujours au même endroit, que le programme ait été lancé par un terminal ou par l'interface graphique.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Runtime permet de lancer un programme, pas d'interpréter une ligne de commande ! C'est donc tout à fait normal qu'il ne trouve pas "cd" qui n'est pas un programme mais une commande intégré au shell.

    Si tu veux interpréter des commandes il faut passer par le shell...


    Enfin, le "user.dir" est spécifique à Java. Tu as une méthode exec() qui attend un File en paramètre, et qui te permet de modifier le répertoire de travail du process...


    Sinon une remarque : il faut fermer OU traiter les flux, mais ne surtout pas les ignorer comme tu le fait avec le flux d'erreur...


    Plus d'info :


    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    OK, merci pour ta réponse.

    J'ai utilisé la méthode command de l'API Shell pour résoudre mon problème, et ça fonctionne correctement, tout en simplifiant l'utilisation. C'est parfait.

    Sinon, je débute en java, et en POO en général, et je ne sais pas comment fermer les flux d'erreurs, ou les traiter correctement. Peux tu m'en dire un peu plus?

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CyberSlan Voir le message
    Sinon, je débute en java, et en POO en général, et je ne sais pas comment fermer les flux d'erreurs, ou les traiter correctement. Peux tu m'en dire un peu plus?
    Ce n'est pas de la POO ou propre à Java, mais cela correspond à l'utilisation de la classe Process.

    Les Process possèdent 3 flux d'entrées sorties (stdin, stdout et stderr), qui permettent une communication entre ton application Java et le programme que tu as lancé.

    Tu dois traiter ces flux (écrire dedans ou lire leurs contenu) depuis des threads séparé, afin que le programme puisse écrire dedans (sinon il peut se retrouver bloqué en écriture en attendant que tu lises ce qu'il y a dedans).

    Si tu ne veux pas les traiter, tu peux les fermer directement (avec close()), ce qui fait que le programme écrira dans le vide sans être bloqué (mais tu perd tout).

    Il y a plus de détail dans le tuto que je t'ai donné... mais l'API Shell gère cela


    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    OK, merci, je regarderais le tuto pour me renseigner plus en détail.

    J'ai vu dans la doc que l'API gère déjà tout ça, mais je voulais juste en savoir un peu plus, pour éviter de refaire ce genre d'erreur.

    En fait, j'avais mal compris, j'ai cru qu'il s'agissait de quelque chose que j'avais mal fait dans le bloc try - catch.

    Merci encore pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/09/2012, 13h20
  2. Réponses: 5
    Dernier message: 13/03/2011, 09h38
  3. Appelle de commande shell sous linux
    Par jobe dans le forum C
    Réponses: 3
    Dernier message: 01/05/2007, 11h54
  4. Lire un fichier txt par http (C sous Linux)
    Par sleg dans le forum Réseau
    Réponses: 4
    Dernier message: 18/10/2005, 11h07
  5. [Linux]Sélectionner coller par la molette sous linux...
    Par niiccoo59 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 03/05/2005, 18h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo