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 :

Test de taille d'un fichier sous Windows 7


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut Test de taille d'un fichier sous Windows 7
    Bonjour,

    J'ai un fichier de type ".txt" et je désire tester s'il est vide ou pas.

    j'ai essayé deux méthode mais bizarrement ça marche pas surtout la fonction file.lenth.

    Voici ma fonction avec des System.out.println :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     /**
        * Fonction qui permet la suppression du fichier vide.
        */
       private static boolean supprimerFichierVide(String fichier){
           File f = new File(fichier);
           System.out.println("le fichier à tester est:::" + fichier );
           System.out.println("la taille du fichier à tester est:::" + f.length());
           String toto = lireDocument(fichier);
           System.out.println("le contenue du fichier à tester est:::" + toto );
           System.out.println("la longueur  de la chaine du contenue du fichier est:::" + toto.length() );
           return false;
       }
    Voici le code de la fonction lireDocument(String fichier)

    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
     /**
        * Fonction qui permet de récuperer le contenu d'un fichier.
        * @param nomfichier
        * @return
        */
       public static String lireDocument(String nomFichier){
           String result = "";
           try{
                String fichier = getNomFichier(nomFichier);
                File f = new File(fichier);
                if(f.exists()){
                    InputStream ips=new FileInputStream(fichier);
                    InputStreamReader ipsr=new InputStreamReader(ips);
                    BufferedReader br=new BufferedReader(ipsr);
                    String ligne;
                    while ((ligne=br.readLine())!=null){
                        result+=ligne+"\n";
                        }
                    br.close();
                }else{
                    result = null;
                }
           }
           catch (Exception e){
    	    result = "Error";
    	}
           return result;
       }
    Aprés le lancement de mon programme j'ai le résultat suiavnt dans la console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    le fichier à tester est:::C:\user\travaux\projets\projets_réalisés\projet1\documents\agent_Chirurgicaux.txt
    la taille du fichier à tester est:::3
    le contenue du fichier à tester est:::
    la longueur  de la chaine du contenue du fichier est:::2
    Donc dans le résultat j'ai :

    1) Le fichier à tester existe : C:\user\travaux\projets\projets_réalisés\projet1\documents\agent_Chirurgicaux.txt

    2) le contenue du fichier est null (le contenue du fichier à tester est::.

    3) La taille du fichier normalement doit être 0, mais la fonction f.length() renvoie 3, je comprends pas pourquoi (j' utilise windowz 7).

    4) La longueur de la chaîne contenue dans le fichier doit être 0, mais moi j'obtient 2.

    Pouvez-vous m'indiquez d'ou vient ce problème? vous avez un code plus correcte pour faire la même chose?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    2) jamais votre code ne vous dit que le contenu est null
    3) Ben c'est que le fichier n'est pas vide.
    4) La différence avec length viens du fait que vous ne lisez pas exactement le contenu du fichier puisque vous interprétez les retours à la ligne via bufferedreader.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut
    Donc c'est un problème d’écriture et lecture du fichier?
    Je vois pas exactement le problème,pouvez-vous m'indiquer comment puis-je résoudre le problème?

    Merci d'avance.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Vous n'aurez jamais de correspondance garantie entre votre String et la longueur de fichier. Un string représente des caractères, un fichier des octets. Un caractère peut occuper plusieurs octets suivant l'encodage.

    De plus, \n c'est une caractère, alors qu'un retour à la ligne sous windows c'est deux caractère \r\n . BufferedReader digère vos retours à la ligne et donc impossible se savoir si c'était \n ou \r\n à l'origine.


    Mis à part ça, je ne vois pas de soucis avec votre code, qu'est-ce qui vous tracasse?

  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,


    Ceci est particulièrement dangereux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	String ligne;
    	while ((ligne = br.readLine()) != null) {
    		result += ligne + "\n";
    	}
    	br.close();
    A cause de l'opérateur += cela produit plusieurs objets par ligne, et cela peut donc engendrer de très très mauvaise performance si on augmente le nombre de ligne. Il est préférable de passer par un StringBuilder !

    De plus puisque tu veux récupérer TOUT le fichier, cela ne sert à rien de le lire ligne par ligne. Une lecture par bloc serait plus approprié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	StringBuilder sb = new StringBuilder();
    	char[] cbuf = new char[8192];
    	int len;
    	while ((len=br.read(cbuf))>=0) {
    		sb.append(cbuf, 0, len);
    	}
    (sur un fichier de 20000 lignes je passes de 8 secondes à 16... millisecondes !)




    De même, il faudrait utiliser un try/finally pour fermer le fichier proprement.



    Enfin la gestion des erreur est... étrange !?


    a++

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut
    Merci pour vos réponse.

    @Tchize: ce que me tracasse c'est que je veux supprimer le fichier s'il est vide, mais le problème c'est que même s'il est vide, j'ai sa taille égal à trois pas zéro.


    @adiGuba: j'ai compris le problème dangereux, mais je comprends pas cette phrase : (sur un fichier de 20000 lignes je passes de 8 secondes à 16... millisecondes !).

    C'est à moi de paramétrer si on'est dans 8 ou 16 millisecondes? car on sait pas qu'elle est la taille du fichier.

    Pour cette déclaration : char[] cbuf = new char[8192]; il faut toujours utiliser 8192?

    Peux-tu STP m'expliquer?

    Merci d'avance.

  7. #7
    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 amine1980 Voir le message
    @Tchize: ce que me tracasse c'est que je veux supprimer le fichier s'il est vide, mais le problème c'est que même s'il est vide, j'ai sa taille égal à trois pas zéro.
    Comment est généré ce fichier "vide" ? Le problème vient surement de là...


    Citation Envoyé par amine1980 Voir le message
    @adiGuba: j'ai compris le problème dangereux, mais je comprends pas cette phrase : (sur un fichier de 20000 lignes je passes de 8 secondes à 16... millisecondes !).
    Pour lire un fichier de 20000 lignes il me faut 8 secondes avec ton code.
    En utilisant un StringBuilder comme dans mon exemple cela ne prend plus que 16 millisecondes.

    Cela signifie tout simplement que l'opérateur += dans une boucle est très gourmand en mémoire, et que le temps de traitement sera exponentielle lorsqu'on augmente la taille du fichier.
    C'est donc à éviter à tout prix !

    Citation Envoyé par amine1980 Voir le message
    C'est à moi de paramétrer si on'est dans 8 ou 16 millisecondes? car on sait pas qu'elle est la taille du fichier.
    Non : il ne faut pas utiliser += dans une boucle. C'est tout ! Il faut utiliser StringBuilder comme dans l'exemple...


    Citation Envoyé par amine1980 Voir le message
    Pour cette déclaration : char[] cbuf = new char[8192]; il faut toujours utiliser 8192?
    C'est juste une taille de buffer choisi arbitrairement.
    C'est généralement ce qui est utilisé, mais libre à toi d'en choisir une autre si besoin...


    a++

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut
    Comment est généré ce fichier "vide" ? Le problème vient surement de là...
    Voici le code de la fonction qui ecrit le fichier :

    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
     /**
         * Focntion qui permet d'écrire dans le fichier.
         */
        private static String ecrireDansLeFichier(String fichier,String chaine,SuiviPatientlFrame spf){
            FileWriter fw;
            String exception = null;
            try {
                fw = new FileWriter(fichier);
                BufferedWriter bw = new BufferedWriter (fw);
                PrintWriter fichierSortie = new PrintWriter (bw);
                fichierSortie.println (chaine+"\n");
                fichierSortie.close();
            } catch (IOException ex) {
                exception = "Problème d'écriture dans le fichier " + fichier;
                afficherDialogue(spf,titre,exception);
            }
            return exception;
        }
    Il y'a un problème dans ce code?T'as STP un code plus propre?

    Remarque : j'ai remarqué que cette fonction m'ecrit pas la chaîne telle qu'elle est, par exemple, si je veux 'écrire la chaîne (bonjour test
    bonjour test2 ) : bonjour test dans une ligne et bonjour teste2 dans deuxième ligne, il m'écrit tout dans la même ligne.

    T'as STP un code plus propre?

    Merci d'avance.

  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 amine1980 Voir le message
    Il y'a un problème dans ce code?T'as STP un code plus propre?
    Ben déjà il ne peut pas générer un fichier vide puisque tu écris TOUJOURS quelque chose dedans...


    Pour le reste il manque surtout le try/finally pour la libération des ressources, et une gestion bizarre des exceptions...

    a++

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut
    Salut,

    Ben déjà il ne peut pas générer un fichier vide puisque tu écris TOUJOURS quelque chose dedans...
    je vois si je crée toujours quelque chose dedans?j'écris un chaine vide, donc ça donne pas fichier vide?sinon comment créer fichier vide?

    Pour le reste il manque surtout le try/finally pour la libération des ressources, et une gestion bizarre des exceptions...
    oui je vais ajouter le try/finally,pour la gestion des exception, c'est le client qui demande l'affichage des exceptions dans des boites de dialogue de type JDialogue.

    sinon que penses-tu pour le problème de création du fichier si la chaîne est vide?
    merci d'avance.

  11. #11
    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 amine1980 Voir le message
    je vois si je crée toujours quelque chose dedans?j'écris un chaine vide, donc ça donne pas fichier vide?sinon comment créer fichier vide?
    Tu y rajoutes un caractère de fin de ligne "\n"... et même deux puisque tu utiliser println() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fichierSortie.println (chaine+"\n")
    Et println() utilisant la fin de ligne du système (soit "\r\n" sous Windows), tu écris bien 3 caractères dans ton fichiers...

    Pour faire un fichier vide il suffit de ne rien écrire dans le fichier...


    Citation Envoyé par amine1980 Voir le message
    oui je vais ajouter le try/finally,pour la gestion des exception, c'est le client qui demande l'affichage des exceptions dans des boites de dialogue de type JDialogue.
    Je veux bien... mais pourquoi ne pas remonter l'exception normalement plutôt que de la retourner en valeur de retour ???


    a++

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut
    Bonjour,

    En faîte j'arrive bien maintenant à créer le fichier vide,mais j'ai un problème de suppression de ce fichier.

    voici la fonction d'écriture :

    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
    /**
        * Focntion qui permet d'écrire dans le fichier texte.
        * @return
        */
       public static void ecrireDocument(String nomFichier, String chaine,SuiviPatientlFrame spf){
           String fichier = cheminFichier +System.getProperty("file.separator")+nomFichier;
           //Vérifier l'éxistance du répertoire documents.
           if(verifierExistanceRepertoire(cheminFichier)){//Le répertoire existe.
                ecrireDansLeFichier(fichier,chaine,spf);
           }else{//Le répertoire n'existe pas : on le crée.
                 boolean creationRepertoire = new File(cheminFichier).mkdirs();
                 if(creationRepertoire){//Répertoire crée avec succé.
                    ecrireDansLeFichier(fichier,chaine,spf);
                 }else{//Répertoire non crée.
                    String exception = "Problème de création du répertoire: " + cheminFichier;
                    afficherDialogue(spf,titre,exception);
                 }
            }
           //Suppression du fichier s'il est vide.
           supprimerFichierVide(fichier);
       }
    *Voici la fonction de suppression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /**
        * Fonction qui permet la suppression du fichier vide.
        */
       private static boolean supprimerFichierVide(String fichier){
           File f = new File(fichier);
           boolean flag = true;
           try{
               flag = f.delete();
           }catch(Exception e){
               flag = false; 
               e.printStackTrace();
           }
           return flag;
       }

    *Voici la fonction ecrireDansLeFichier(fichier,chaine,spf):

    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
     /**
         * Focntion qui permet d'écrire dans le fichier.
         */
        private static String ecrireDansLeFichier(String fichier,String chaine,SuiviPatientlFrame spf){
            FileWriter fw;
            String exception = null;
            try {
                fw = new FileWriter(fichier);
                if(!"".equals(chaine)&& chaine != null){
                      BufferedWriter bw = new BufferedWriter (fw);
                      PrintWriter fichierSortie = new PrintWriter (bw);
                      fichierSortie.println (chaine+"\n");
                      fichierSortie.close();
                }
                fw.close();
     
            } catch (IOException ex) {
                exception = "Problème d'écriture dans le fichier " + fichier;
                afficherDialogue(spf,titre,exception);
            }
            return exception;
        }
    Le fichier se crée bien avec la taille 0, mais la focntion de suppression f.delete() me renvoie false, et par conséquence le fichier n'est pas supprimé et aucune exception n'est catchée.

    Merci d'avance pour ton aide.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut
    en fin ça marche .
    il fallait juste rebuilder le projet.

    Merci infiniment pour votre aide.

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

Discussions similaires

  1. Taille Max fichier sous Windows 7
    Par kadden dans le forum Windows 7
    Réponses: 8
    Dernier message: 28/06/2013, 12h56
  2. date de modification de fichier sous windows
    Par brisbo dans le forum Windows
    Réponses: 2
    Dernier message: 04/05/2006, 23h45
  3. gestion de fichier sous windows en posix
    Par fan² dans le forum Réseau
    Réponses: 11
    Dernier message: 07/12/2005, 18h40
  4. Changer les droits d'un fichier sous windows
    Par lnikolanta dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 26/09/2005, 17h03

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