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

Collection et Stream Java Discussion :

Fusionner 3 fichiers via Input/Output Stream


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Par défaut Fusionner 3 fichiers via Input/Output Stream
    Bonjour,
    Alors voila j'ai un petit soucis/interrogation.

    Je veux partir de 3 fichiers et les fusionner en un seul, et j'ai réussi mais il se passe un comportement etrange, alors plutot que de le contourner "a la main", je voudrais comprendre le pourquoi...

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //existence du fichier dictionnaire
    java.io.File dico = new java.io.File("dictionnaryTest.txt");
    	if (dico.exists()== false){
    		myOutputDico = new FileOutputStream("dictionnaryTest.txt");
     
    		//cas ou le fichier dico n'existe pas, on le copie
     
    		myInputDico1 = new FileInputStream(NAME_DICO);
    		myInputDico2 = new FileInputStream(NAME_DICO2);
    		myInputDico3 = new FileInputStream(NAME_DICO3);
     
    				 copy(myInputDico1,myInputDico2,myInputDico3,myOutputDico);
    }
    et la méthode copy :

    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
     
    private static void copy(InputStream inputStream1, InputStream  inputStream2, InputStream inputStream3, FileOutputStream outputFile) {
     
    		BufferedOutputStream bufOut = new BufferedOutputStream(outputFile, 8192);
    		BufferedInputStream bufIn1 = new BufferedInputStream(inputStream1, 8192);
    		BufferedInputStream bufIn2 = new BufferedInputStream(inputStream2, 8192);
    		BufferedInputStream bufIn3 = new BufferedInputStream(inputStream3, 8192);
     
    		byte buf[] = new byte[8192];
     
    		int len;
     
    		try {
     
    			while ((len = bufIn1.read(buf)) != -1) {
     
    				bufOut.write(buf, 0, len);
     
    			}
     
     
    			while ((len = bufIn2.read(buf)) != -1) {
     
    				bufOut.write(buf, 0, len);
     
    			}
     
     
    			while ((len = bufIn3.read(buf)) != -1) {
     
    				bufOut.write(buf, 0, len);
     
    			}
    			bufOut.flush();
     
     
    			bufOut.close();
     
    			bufIn1.close();
    			bufIn2.close();
    			bufIn3.close();
     
    		} catch (IOException e) {
     
    		}	
    	}
    Donc le soucis c'est que la 1ere ligne (en l'occurence le 1er mot vu que c'est un mot par ligne) des 2 sous fichiers dico2 et dico3 sont ignorés, en debug, "len" prend bien la bonne valeur du nombre a écrire mais il n'ecrit simplement pas le debut dans le fichier en output... donc j'ai trouvé comme solution simplement de sauter la 1ere ligne des 2eme et 3eme fichiers, et la impec ça a bien tout fusionner, mais je comprends pas pourquoi il rate ainsi des données ...

    Merci

  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,


    Tu pourrais donner un exemple avec de résultats avec de petits fichiers ?
    Tu es sûr que ce n'est pas simplement un retour à la ligne manquant à la fin du fichier qui fait remonter la ligne à la fin de la dernière du fichier précédent.


    Sinon quelques remarques concernant ton code :
    • Il faut utiliser des try/finally pour la fermeture des fichiers !
    • Il ne faut jamais ignoré une exception !!!
    • Cela ne sert à rien d'utiliser des Buffered*Stream si tu utilises ton propre buffer.
    • On ne sait pas où sont déclarées tes variables myOutputDico/MyInputDico*. Ce devrait être des variables locales déclaré en lignes, et suivi du try/finally de fermeture...



    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Par défaut
    Tout d'abord merci de repondre

    Alors :
    -en effet je sais que faut les mettre en finally, la j'avoue avoir un peu zapper, c'est moche

    -l'exception je ne l'ignore pas, en fait ce code est issue d'un code que je fais sur android que j'ai adapté "a la va vite" sur du java "normal" pour voir si il y avait le meme probleme, et oui, d'ou les petites remarques, et notamment le catch (sur la version android, j'ecris dans un Log special)

    -remarque liée a la premiere, je les declare juste au dessus du code cité, mais en effet en local dans le try serait plus propre

    Concernant la solution, en effet, les fichiers n'ont pas de retour a la ligne final, ils se terminent sur le dernier mot listé, mais alors pourquoi faut-il un retour a la ligne ?

  4. #4
    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
    Citation Envoyé par Mikiya Voir le message
    mais alors pourquoi faut-il un retour a la ligne ?
    Parce que tu veux qu'il y ait un retour à la ligne. Les fichiers sont recopiés tels que, sans ajouter de retour à la ligne là où il n'y en a pas. Or, apparemment, tu veux qu'il y ait un retour à la ligne. Si tu n'en avais pas envie, il n'y en aurait pas besoin.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Par défaut
    Non justement, je veux que les 3 fichiers s’enchaînent dans un fichier final sans arrêts ni sauts, hors la, il me saute la 1ere ligne (enfin le 1er mot listé) des 2eme et 3eme fichiers, d'où ma solution temporaire mais "crade" de sauter une ligne au debut de ces fichiers la pour qu'il "rate" la ligne vide et ainsi ne perde pas de mots, mais je voudrais idéalement ne pas avoir a faire cette "bidouille".

  6. #6
    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
    J'ai parlé des retours à la ligne finaux, pas des retours à la ligne initiaux.

    En résumé, Java ne va pas inventer tout seul de retour à la ligne là où il n'y en a pas. Donc, si tu en veux un entre tes deux fichiers, il faut bien qu'il soit quelque part.
    À la fin du précédent ou au début du suivant, c'est toi qui voit. Mais en général, l'usage est qu'un fichier texte se termine toujours par un retour à la ligne.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/08/2014, 18h30
  2. Input-Output Stream et réseau
    Par warseb dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 27/02/2008, 20h36
  3. Obtenir la taille d'un fichier selectionné via input
    Par Tchupacabra dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 29/06/2007, 08h54
  4. Cipher Input/Output Stream
    Par Razgriz dans le forum Sécurité
    Réponses: 16
    Dernier message: 13/05/2007, 16h32
  5. Problème input/output fichier
    Par nenekes dans le forum Cobol
    Réponses: 3
    Dernier message: 09/09/2006, 22h54

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