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 :

Fusion de fichiers


Sujet :

Java

  1. #1
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut Fusion de fichiers
    Salut à tous !

    J'aimerai fusionner des fichiers en java sur une machine Red Hat.
    J'ai développé une petite méthode mais rien ne se passe, ça s'exécute, mais rien de plus..
    Ma méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static final void fusionFiles(String firstPath, String destination) {
            try {
                String cmd = "cat " + firstPath + " >> " + destination;
                Process p = Runtime.getRuntime().exec(cmd);
                p.waitFor();
                p.destroy();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Probleme pour fusioner les fichier : " + firstPath + " " + destination);
            }
        }
    Aucune exception n'est levée, pas à pas je vois que l'exécution est correcte, ça passe pas dans le catch.
    Cette commande marche dans un terminal :
    cat /home/test/test >> /home/test/result
    Si quelqu'un a une idée ca serrait cool
    Merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Runtime.exec() n'est pas un terminal.
    Il appelle l'API du système d'exploitation qui prend le nom d'un programme et la liste de ses paramètres.

    Or >> comme paramètre du programme cat, ça veut dire "fichier nommé >>" et ce fichier n'existe sans doute pas.

    Le plus simple serait
    - D'utiliser ProcessBuilder
    - D'appeler un terminal pour lui donner cette commande à exécuter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new ProcessBuilder("/bin/sh", "-c", "cat chose >> machin").inheritIO().start().waitFor();
    À noter quand même que concaténer avec cat, c'est facile et rapide, ok, mais ça marche que sur les environnements posix, bref pas Windows (ou mobile.) Alors que l'un des atouts de Java est qu'on s'embête pas à se demander sur quel environnement on est, et que concaténer en Java c'est pas non plus si compliqué que ça.

  3. #3
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Salut,

    Merci beaucoup pour ta réponse !
    C'est super, je me doutais bien que le problème était Runtime.exec(), j'ai eu un autre problème pour md5sum je crois qui était du même ordre, et j'ai dû passer par un processBuilder aussi, mais j'avais pas compris pk, là j'ai compris =D
    Merci beaucoup !

    Et oui effectivement je pourrai le faire en Java, mais là j'ai besoin de perf, mais surtout mon programme ne tournera jamais sur un Windows ou autre, ça restera sur du red hat.
    Donc bon j'en ai pas l'utilité, et c'est quand même plus rapide à dev une petite méthode de 3ptites lignes que dev la méthode complète ^^

    Merci encore

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Donc bon j'en ai pas l'utilité, et c'est quand même plus rapide à dev une petite méthode de 3ptites lignes que dev la méthode complète ^^
    Jme permets d'avoir des doutes quand même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static void fusionFiles(String firstPath, String destination) {
      try(OutputStream out = Files.newOutputStream(Paths.get(destination), APPEND, CREATE)) {
        Files.copy(Paths.get(firstPath), out);
      } catch (Exception e) {
        e.printStackTrace();
        System.out.println("Probleme pour fusioner les fichier : " + firstPath + " " + destination);
      }
    }

  5. #5
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Sennad Voir le message
    Et oui effectivement je pourrai le faire en Java, mais là j'ai besoin de perf, mais surtout mon programme ne tournera jamais sur un Windows ou autre, ça restera sur du red hat.
    Heu ? Sérieusement c'est quoi cette excuse en bois ???
    En quoi est-ce plus performant de créer un (voir deux) process supplémentaire ?

    Citation Envoyé par Sennad Voir le message
    Donc bon j'en ai pas l'utilité, et c'est quand même plus rapide à dev une petite méthode de 3ptites lignes que dev la méthode complète ^^
    Cela prend même pas trois ligne en Java 7 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public static final void fusionFiles(String firstPath, String destination) throws IOException {
    		try (OutputStream out = new FileOutputStream(destination, true)) {
    			Files.copy(Paths.get(firstPath), out);
    		}
        }
    A la rigueur en Java 6 ou inférieur c'est un poil plus long à cause de l'absence de méthode de copie et du try-with-ressource, mais ca prend 2 minutes à écrire :
    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
    	public static final void fusionFiles(String firstPath, String destination) throws IOException {
    		InputStream input = new FileInputStream(firstPath);
    		try {
    			OutputStream output = new FileOutputStream(firstPath, true);
    			try {
    				byte[] buf = new byte[8192];
    				int len;
     
    				while ( (len=input.read(buf)) > 0 ) {
    					output.write(buf, 0, len);
    				}
    				output.flush();
     
    			} finally {
    				output.close();
    			}
    		} finally {
    			input.close();
    		}		
        }

    [edit] grillé !


    a++

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Heu ? Sérieusement c'est quoi cette excuse en bois ???
    En quoi est-ce plus performant de créer un (voir deux) process supplémentaire ?
    D'un point de vue théorique et si les fichiers sont gros et le programme petit,
    - l'overhead de création de process est négligeable
    - Java va au moins faire, ce que cat ne fait pas, passer son temps à vérifier que les indexes du buffer sont valides

    ... Mais en pratique j'y crois pas des masses quand même.

  7. #7
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Je ne pense pas (je peux me tromper) que ca soit plus rapide.
    Puis j'en ai absolument aucun interet, mais alors aucun, alors pk faire ?
    Mais c'est bon à savoir.
    Merci encore

  8. #8
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Apres quelque test :
    Avec cat c'est 3.7 fois plus long qu'avec Files.copy
    J’ai bouclé 5000 fois en appelant la méthode.
    34 secondes vs 9 secondes ^^
    Merci adiGuba ^^
    Bon ça me sert quand même à rien xD mais ça coute rien de laisser comme ça

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thelvin Voir le message
    ... Mais en pratique j'y crois pas des masses quand même.
    Franchement je doute vraiment que l'appel d'un cat via un shell soit plus rapide.

    Si on doit traiter de gros fichier, le plus rapide serait alors de passer par des FileChannel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		try (FileChannel input = FileChannel.open(Paths.get(firstPath));
    			FileChannel output = FileChannel.open(Paths.get(destination), StandardOpenOption.CREATE, StandardOpenOption.APPEND)) {
    			input.transferTo(0, input.size(), output);
    		}
    a++

  10. #10
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Apres quelque test :
    Avec cat c'est 3.7 fois plus long qu'avec Files.copy
    J’ai bouclé 5000 fois en appelant la méthode.
    34 secondes vs 9 secondes ^^
    Logique : cat doit faire sensiblement la même chose que Files.copy() !
    Donc le faire immédiatement doit être plus rapide que d'exécuter un shell (/bin/sh) pour lui demander d'appeler un programme (cat) pour au final faire la même chose...



    [edit] Et en plus on aura une meilleure remontée d'erreur !

    a++

  11. #11
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Yep ! C'est super merci encore



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

Discussions similaires

  1. Fusion des fichiers son
    Par Abstract_cl dans le forum Audio
    Réponses: 9
    Dernier message: 25/08/2007, 14h18
  2. [JDOM] Fusion de fichiers XML
    Par rptmat57 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 18/07/2007, 11h37
  3. Réponses: 2
    Dernier message: 24/01/2007, 17h38
  4. fusion de fichiers XML et access 2003
    Par frdek dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 29/11/2005, 11h23
  5. [XSLT] Fusion de fichier XML ???
    Par webtheque dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 04/03/2005, 20h13

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