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

Entrée/Sortie Java Discussion :

fusionner deux fichiers texte en java [merging text files in Java]


Sujet :

Entrée/Sortie Java

  1. #1
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    2
    Points
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 2
    Points : 2
    Par défaut fusionner deux fichiers texte en java [merging text files in Java]
    Bonjour,

    je voulais fusionner deux fichiers texte pour en créer un troisième en Java, je n'avais pas trouvé de solution alors j'ai développé cette méthode. J'éspère qu'elle servira pour d'autres.
    S'il y a mieux n'hésitez pas à me répondre.


    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    /**
         * Create a file3 whose content is = file1 content followed by file2 content  
         * @param file1 first file name 
         * @param file2 second  file name
         * @param file3 fusion result file 
         */
    	public void writeFusionFiles(String file1, String file2, String file3){
     
    		try { 
    		    File temp= null;	
    		    temp= new File(file3);
    		    boolean ch=temp.createNewFile();
    		    if(ch)
    		    {
    		      System.out.println("file created");
    		    }
    		    else
    		     {
    		       System.out.println("file Not created");
    		     }
     
    		    FileWriter fos3 = new FileWriter(file3);
    			BufferedWriter bw3 = new BufferedWriter(fos3);
     
    		    FileReader fr1 = new FileReader(file1) ;
    		    BufferedReader br1 = new BufferedReader(fr1);
     
    		    FileReader fr2 = new FileReader(file2) ;
    		    BufferedReader br2 = new BufferedReader(fr2);
     
     
    		    while(br1.ready()){
    		    	bw3.write(br1.readLine());
    		    	bw3.newLine();
    		    }
    		    while(br2.ready()){
    		    	bw3.write(br2.readLine());
    		    	bw3.newLine();
    		    }
     
     
    		    bw3.close() ;
    		    br1.close() ;
    		    br2.close() ;
     
     
    		} catch (IOException ioe)		{ 
    			System.out.println( "IO error:" +ioe ); 
                }  
     
     
    	}

    merci,
    thanks

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    151
    Points
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 151
    Points : 151
    Par défaut
    kikou,
    Si ton code fonctionne alors je ne vois pas de problème.
    Sinon du coté des api xml tu n'as que l'embarras de choix.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Points
    23 190
    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
    Billets dans le blog
    1
    Par défaut
    Salut,



    Perso j'y vois quand même quelques petits problèmes et/ou alternatives qui pourrait être intéressante :



    • Si tu n'arrives pas à créer le fichier tu continues quand même la copie (tu te contentes d'afficher un message)
      A la rigueur je dirais que le createNewFile() est inutile puisqu'il est implicite lorsque tu crées le Writer...

    • Les ouvertures de fichiers doivent être immédiatement suivi par un try/finally, ceci afin d'être sûr de refermer correctement le fichier dans tous les cas (lire FAQ : Comment libérer proprement les ressources ?).
      Sinon en cas d'exception pendant le traitement tu conserveras les fichiers ouverts


    • Tu utilises une lecture ligne par ligne... ce qui n'est pas forcément le plus performant en particulier si les lignes sont petites (quoi que c'est atténué par le fait que tu utilises des flux bufférisés).
      Il serait quand même préférable de faire une lecture par bloc et de gérer le buffer par toi même.


    • Perso j'aurais plutôt tendance à remonter une exception plutôt que de la traiter comme cela dans la méthode. Avec ton code on ne peut pas savoir si l'opération s'est bien déroulé ou pas...


    • Enfin tu utilises des Reader, ce qui fait que tu limites ton code aux fichiers textes, et même pire : au fichiers textes qui utilisent l'encodage système (sinon le fichier de destination risque de posséder des caractères invalides).
      En utilisant des flux standards (byte) ta méthode devient 100% portable...

    • Tu pourrais enfin utiliser un tableau en paramètre au lieu des paramètres file1 et file2.
      Cela permet non seulement de minimiser le code (au lieu de dupliquer le code de copie, tu le met dans une boucle ), mais également d'améliorer les possibilitées offertes par ta méthode (on peut merger plus de deux fichiers). De plus avec Java 5.0 on peut remplacer le tableau par une ellipse (nombre d'argument variable) afin d'en faciliter l'utilisation...




    Ce qui donnerait :
    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
    29
    30
    31
    32
    	/**
             * Crée (ou remplace) un fichier nommé 'destFile' avec le contenu
             * des fichiers indiqués dans 'sourceFiles'.
             * 
             * @param destFile              Le nom du fichier à créer/remplacer.
             * @param sourceFiles   Les noms des fichiers à merger.
             * @throws IOException  Erreurs d'IO quelquonque
             */
    	public void writeFusionFiles(String destFile, String...sourceFiles) throws IOException {
    		// On ouvre (ou on crée) le fichier de destination :
    		OutputStream out = new FileOutputStream(destFile);
    		try {
     
    			byte[] buf = new byte [8192]; // buffer de copie par bloc
    			int len; // compteur de byte lu
     
    			for (String filename : sourceFiles) {
    				InputStream in = new FileInputStream(filename);
    				try {
    					// On lit dans le buffer (bloc de 8192 bytes max)
    					while ( (len=in.read(buf)) >= 0 ) {
    						out.write(buf, 0, len); // et on copie ce qu'on a lu
    					}
    				} finally {
    					in.close();
    				}
    			}
     
    		} finally {
    			out.close();
    		}
    	}


    Après tu pourrais imaginer d'autres améliorations, comme éviter d'écraser un fichier existant, ou encore de supprimer le fichier de destination en cas d'erreur...



    a++

Discussions similaires

  1. Fusionner deux fichiers XML en Java
    Par gotteserbin dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 30/04/2014, 17h58
  2. fusionner deux fichiers .exe en un seul
    Par splifo dans le forum Windows
    Réponses: 10
    Dernier message: 03/05/2012, 03h59
  3. Fusionner deux fichiers XML en perl
    Par stephyl86 dans le forum Modules
    Réponses: 3
    Dernier message: 26/01/2012, 23h01
  4. Fusionner deux fichiers identiques access
    Par poplite dans le forum Access
    Réponses: 1
    Dernier message: 06/02/2008, 23h46
  5. Fusionner deux fichiers
    Par frouge dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 22/05/2007, 14h05

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