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 :

FileInputStream, problème fin fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 28
    Points : 17
    Points
    17
    Par défaut FileInputStream, problème fin fichier
    Bonsoir,

    j'ai suivi un tutoriel sur les flux d'entrées/sorties.

    Je voudrais ouvrir un fichier txt, pour le copier dans un autre fichier txt.

    Le problème c'est que le buffer est fixé de taille 8. Si on augmente la taille du buffer, on gagne en rapidité, et au contraire si on la met à 1, on ralenti, si j'ai bien compris ?
    Et donc lorsque mon fichier texte contient 14 caractères par exemple, comme ce n'est pas un multiple de 8, il me recopie bien les 14 premiers caractères, et il m'en rajoute 2 autres... pour arriver à 16..

    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
    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
    53
    //Package à importer afin d'utiliser l'objet File
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
     
    public class Main {
    	public static void main(String[] args) {
    		//Nous déclarons nos objets en dehors du bloc try/catch
            FileInputStream fis;
            FileOutputStream fos;
            BufferedInputStream bis;
            BufferedOutputStream bos; 
     
            try {
            	fis = new FileInputStream(new File("test.txt"));
            	fos = new FileOutputStream(new File("test2.txt"));
            	bis = new BufferedInputStream(new FileInputStream(new File("test.txt")));
                    bos = new BufferedOutputStream(new FileOutputStream(new File("test3.txt")));
                    byte[] buf = new byte[8];
     
                    //On récupère le temps du system
                    long startTime = System.currentTimeMillis();
     
                    while(fis.read(buf) != -1){
                    	fos.write(buf);
                    }
                    //On affiche le temps d'exécution
                    System.out.println("Temps de lecture + écriture avec FileInputStream et FileOutputStream : " + (System.currentTimeMillis() - startTime));
     
                    //On réinitialise                
                    startTime = System.currentTimeMillis();
     
                    while(bis.read(buf) != -1){
                    	bos.write(buf);
                    }
                    //On réaffiche
                    System.out.println("Temps de lecture + écriture avec BufferedInputStream et BufferedOutputStream : " + (System.currentTimeMillis() - startTime));
     
                    //On ferme nos flux de données
                    fis.close();
                    bis.close();
     
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }     	
        }
    }
    c'est dans test2.txt qu'il y a des problèmes, il me rajoute des caractères si la longueur du fichier de départ n'est pas un multiple de 8...

    Et dans test3.txt, qui utilise un BufferedOutputStream, mon fichier test3 reste vide... est ce normal ?

    Merci beaucoup.

  2. #2
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    Citation Envoyé par benji1801 Voir le message
    c'est dans test2.txt qu'il y a des problèmes, il me rajoute des caractères si la longueur du fichier de départ n'est pas un multiple de 8...
    La méthode read de FileInputStream retourne le nombre de caractères écrits.
    Il faut utiliser cette information.

    Citation Envoyé par benji1801 Voir le message
    Et dans test3.txt, qui utilise un BufferedOutputStream, mon fichier test3 reste vide... est ce normal ?
    Oui. Une fois que le stream est arrivé au bout, la méthode read ne retourne plus rien.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Merci pour votre réponse.

    Citation Envoyé par Nudger Voir le message
    La méthode read de FileInputStream retourne le nombre de caractères écrits.
    Il faut utiliser cette information.
    Ok, donc je peux faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    long boucle = fichier.length()/8;
    while(fis.read(buf) != -1 && boucle>0){
          fos.write(buf);
          boucle--;
    }
    Dans ce cas ça me met tous les morceaux de 8 caractères, il me manque le dernier morceau, de taille <8.
    Comment puis le récupérer ?

    Citation Envoyé par Nudger Voir le message
    Oui. Une fois que le stream est arrivé au bout, la méthode read ne retourne plus rien.
    Je ne comprends pas exactement ce que je dois faire pour résoudre ce problème... Pouvez-vous m'aider d'avantage svp ?

    Merci beaucoup

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Je pense avoir répondu à ma première question, j'ai fais ça :

    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
    fis = new FileInputStream(new File("test.txt"));
    fos = new FileOutputStream(new File("test2.txt"));
     
    byte[] buf = new byte[8];
     
    File f = new File("test.txt");
    System.out.println("taille: " + f.length());
     
    long nb = f.length()/8;
    while(nb>0){
           fis.read(buf);
           fos.write(buf);
           nb--;
    }
     
    // On écrit la fin du fichier               
    if(f.length()%8!=0){
          fos.write(buf, 0, fis.read(buf));
    }
    Là ça fonctionne Est-ce correct ?

    Quelqu'un aurait-il une réponse pour ma 2ème question, avec le BufferedInputStream qui ne m'écrit rien...?

    Merci .

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Ah ben c'est bon, j'avais oublié de faire un bos.close() ...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/06/2007, 16h15
  2. [Servlet] Probléme écriture fichier
    Par hedgehog dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 23/05/2005, 15h17
  3. Problème lecture fichier en C++
    Par cali1983 dans le forum C++
    Réponses: 17
    Dernier message: 20/05/2005, 09h36
  4. Problème ouverture fichier par double clic...
    Par sankookai dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2005, 09h13
  5. Problème avec fichier texte
    Par jpdelx dans le forum ASP
    Réponses: 7
    Dernier message: 13/11/2003, 13h17

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