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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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
    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,


    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 éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    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.

+ 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