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

Java Discussion :

Runtime.getRuntime().exec Argument list too long


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 45
    Par défaut Runtime.getRuntime().exec Argument list too long
    Bonjour,

    Lorsque que j’exécute ce code, j'ai l'erreur Argument list too long.
    Cela vient de la variable text, qui est une variable trop longue.

    Ce que le code fait c'est : qu'il lance un shell pour écrire un texte dans un exécutable lexFile et renvoie le résultat dans un fichier namefileCensure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	public void launchLex(String text, String namefileCensure) throws Exception {
    		String a = "echo -n \"" + text + "\" | ./" + lexFile + " > " + namefileCensure;
    		String aze[] = new String[] {"/bin/sh", "-c", a};
    		process = Runtime.getRuntime().exec(aze);
    	}
    Y a t-il une solution pour éviter l'erreur et que tout s'exécute en commande shell ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Oui, écrire le texte dans un fichier temporaire puis faire un cat dessus au lieu de le générer avec echo.

    Mais pourquoi vouloir absolument le faire en commande shell ?
    Il suffit de lancer seulement l'exécutable lexFile, envoyer le texte dans son entrée standard, et écrire sa sortie standard dans le fichier namefileCensure.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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,

    Citation Envoyé par lea.soineca Voir le message
    Y a t-il une solution pour éviter l'erreur et que tout s'exécute en commande shell ?
    Pas vraiment non...
    Une commande shell a une limite de longueur (qui peut dépendre du shell), et je ne pense pas que cela puisse être modifié.


    Par contre au lieu de passer par le shell, tu peux simplement exécuter directement le process, en lui passant le texte en entrée et en envoyant le résultat dans un fichier par toi même.
    Avec Java 7 c'est assez facile à faire :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    	public void launchLex(final String text, String namefileCensure) throws Exception {
    		String lexFile = ""; // ??? le nom de ton process
     
    		// On appelle seulement le process lexFile :
    		final Process process = new ProcessBuilder(lexFile)
    			// On redirige les erreurs dans System.err :
    			.redirectError(Redirect.INHERIT)
    			// On redirige la sortie dans un fichier :
    			.redirectOutput(new File(namefileCensure))
    			.start();
    		try {
     
    			// Normalement il faudrait traiter les flux stderr
    			// et stdout du process (depuis différents threads)
    			// Mais là c'est inutile puisqu'on les a redirigés
    			// lorsqu'on a crée le process.
     
    			// Il n'y donc qu'à traiter le flux stdin du process,
    			// qui attend le contenu du texte qu'on lui envoi tel quel.
    			try (Writer out = new OutputStreamWriter(process.getOutputStream())) {
    				out.write(text);
    			}
     
    		} finally {
    			// Petit garde-fou au cas où le process se bloque :
    			process.destroy();
    		}
    	}


    a++

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 45
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    En fait, de base la variable text est un chaine que je récupère dans un fichier.
    Donc le fait de remplacer le echo par un cat arrange tout ! J'évite de lire le texte ! J'avais pas pensé a cette solution !

    Merci !

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

Discussions similaires

  1. [Système][Runtime]getRuntime().exec
    Par Neptune8 dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 22/02/2011, 19h34
  2. passer des arguments avec Runtime.getRuntime().exec;
    Par firgon dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 07/11/2008, 07h16
  3. tar : argument list too long
    Par gifffftane dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 26/06/2008, 23h29
  4. [Runtime.getRuntime().exec] ouvrir un fichier ??
    Par miloud dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 29/03/2006, 14h23
  5. [Swing] execution avec Runtime.getRuntime().exec
    Par benssj5 dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/08/2004, 14h54

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