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 :

Modifier le contenu d'un fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 58
    Points
    58
    Par défaut Modifier le contenu d'un fichier
    Salut à tous

    Je veux pouvoir appliquer des modifications sur un même fichier. C'est-à-dire qu'en entrée j'ai un fichier et en sortie j'ai le même avec des modifications que je lui applique. J'utilise un fichier buffer pour garder le contenu du fichier en entrée. J'ai un problème car je n'arrive pas à faire cela, ce qui fait qu'en sortie j'ai un fichier vide.

    Voilà mon 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
    15
    16
    FileInputStream fichierEntree = new FileInputStream(fichierABruiter);
    BufferedInputStream buffer = new BufferedInputStream(fichierEntree);
    FileOutputStream fichierSortie = new FileOutputStream(fichierABruiter);
     
    int caractereCourant = buffer.read();
     
    // Tant qu'on a pas atteint la fin du fichier ont continu à bruité ce fichier caractère par caractère
    while ((caractereCourant = buffer.read()) != -1){
    	fichierSortie.write(bruiter(caractereCourant));
    }
     
    buffer.flush();
    buffer.close();
    fichierSortie.close();
    fichierEntree.close();
    bufferEntree.close();
    Si quelqu'un à une idée je suis preneur
    Je ne sais pas si ma méthode est bonne mais je veux essayer de faire quelque chose de simple et propre.

    Merci

  2. #2
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    le flush sur le FileOutputStream, il est où ?
    BufferEntree il est déclaré où ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    Merci iohack

    BufferEntree est une erreur de ma part c'était un ancien buffer de test.
    J'ai essayer en mettant flush sur le FileOutputStream mais ça ne marche pas non plus mais je ne l'ai peut être pas mis au bon endroit.

    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
    FileInputStream fichierEntree = new FileInputStream(fichierABruiter);
    BufferedInputStream buffer = new BufferedInputStream(fichierEntree);
    FileOutputStream fichierSortie = new FileOutputStream(fichierABruiter);
     
    int caractereCourant = buffer.read();
     
    // Tant qu'on a pas atteint la fin du fichier ont continu à bruité ce fichier caractère par caractère
    while ((caractereCourant = buffer.read()) != -1){
    	fichierSortie.write(bruiter(caractereCourant));
    }
     
    fichierSortie.flush();
    buffer.close();
    fichierSortie.close();
    fichierEntree.close();

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


    Lorsque tu ouvres un fichier en écriture, il est automatiquement vidé !
    Donc si tu ouvres le même fichier en même temps en lecture et écriture, il sera vidé AVANT que tu ne puisses le lire.

    Au passage ce n'est pas spécifique à Java mais commun à tous les langages, puisque cela vient de la gestion des fichiers des OS...

    Pour éviter cela tu as deux solutions :
    • Lire entièrement les données du fichier en mémoire, le fermer, modifier les données, puis les écrire dans le fichier. Cette solution marche bien mais peut être couteuse lors de la manipulation de gros fichier.
    • Lire le fichier et écrire en même temps dans un fichier temporaire. Puis à la fin du traitement remplacer le fichier original par le fichier temporaire.


    Par exemple (pour la seconde solution) :
    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
    		// On récupère le chemin absolu du fichier :
    		File file = new File(fichierABruiter).getAbsoluteFile();
     
    		// On crée un fichier temporaire dans le même répertoire
    		File temp = File.createTempFile("fichier", ".tmp", file.getParentFile());
    		try {
     
    			BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
    			try {
    				BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(temp));
    				try {
    					byte buf[] = new byte[1024];
    					int len;
     
    					while ( (len=in.read(buf)) > 0 ) {
    						out.write(buf, 0, len);
    					}
     
    					// + éventuelle ajout
     
    				} finally {
    					out.close();
    				}
    			} finally {
    				in.close();
    			}
     
    			// On supprime le fichier original afin de le remplacer
    			// par le fichier temporaire :
    			if ( ! ( file.delete() && temp.renameTo(file) ) ) {
    				throw new IOException("Impossible de remplacer le fichier : " + file);
    			}
    		} finally {
    			temp.delete(); // on supprime le fichier temporaire quoi qu'il arrive
    		}
    Enfin si tu veux simplement ajouter des données à la fin du fichier, tu peux simplement utiliser l'option "append" des FileOutputStream...

    a++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup de ta réponse adiGuba ça marche.
    Je m'étais aperçu de ce problème mais je ne savais pas comment le résoudre.

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

Discussions similaires

  1. Modifier le contenu d'un fichier PDF en PHP
    Par Ghunter59 dans le forum Langage
    Réponses: 6
    Dernier message: 17/03/2020, 13h27
  2. Modifier le contenu d'un fichier word avec C#
    Par aitbouhou dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/01/2017, 01h14
  3. Modifier le contenu d'un fichier
    Par karim_usthb dans le forum C
    Réponses: 2
    Dernier message: 28/05/2008, 09h42
  4. Modifier le contenu d'un fichier
    Par sconrad dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2008, 17h00
  5. modifier le contenu d'un fichier
    Par progamer54 dans le forum ANT
    Réponses: 1
    Dernier message: 06/12/2007, 11h31

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