Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/03/2010, à 23:55

rwikus090

la taille des fichiers en java ?

j'aimerai éclaircir un point que j'ai découvert par accident (lol) voila je parcourais mon fichier (.bin) et je voulais m'arrêter à la fin et j'ai pas trouvé d'autres solutions alors j'ai essayé sa:

dis=new DataInputStream(new BuffredInputStream(new FileInputStream (new File(fichier.bin))));
do{
x=dis.read();
n++;
}
while(n!=file.length());

et sa marche, alors je me demande, la taille du fichier est calculé par rapport a quoi au nombre d'octet? en plus la j'incrémente mon "n" de 1 a chaque fois

merci de bien vouloir m'aider

Hors ligne

#2 Le 08/03/2010, à 04:37

Sandrew

Re : la taille des fichiers en java ?

Salut,

DataInputStream descend de FilterInputStream, dont tu invoques la methode read(). D'apres la doc, cette methode retourne -1 quand le flux est termine.

La taille du fichier et le nombre de caracteres lus sont relies par l'encodage du fichier (definit par defaut par la JVM lors de son chargement). Tu es peut etre en UTF-8, pour lequel les caracteres courants sont codes sur 1 octet (8 bits). Il y aura donc autant d'octets dans le fichier que de caracteres lus. La taille finale du fichier sera donc egale au nombre de caracteres. Pourtant, si on change l'encodage, on realise que ce qui est vrai pour UTF-8 est faux pour certains autres encodages "exotics". Par exemple :

 
           [US-ASCII] - File Size is [150] - Character count is [150]                       
             [UTF-16] - File Size is [150] - Character count is [75]  <---- Relation Fausse
           [UTF-16BE] - File Size is [150] - Character count is [75]  <---- Relation Fausse
           [UTF-16LE] - File Size is [150] - Character count is [75]  <---- Relation Fausse
             [UTF-32] - File Size is [150] - Character count is [38]  <---- Relation Fausse
           [UTF-32BE] - File Size is [150] - Character count is [38]  <---- Relation Fausse
           [UTF-32LE] - File Size is [150] - Character count is [38]  <---- Relation Fausse
              [UTF-8] - File Size is [150] - Character count is [150]

CCL : Il ne faut pas s'appuyer sur le nombre de caracteres lus pour determiner la fin d'un fichier, mais plutot regarder la doc pour verifier le comportement de l'objet quand le flux s'arrete (la convention est de retourner null ou -1, mais je verifie toujours, au cas ou...). Le code suivant illustre ce que j'ai essaye d'expliquer : pour certains encodages, la relation que tu essayes d'utiliser est malheureusement fausse.

import java.io.*;
import java.util.*;
import java.nio.charset.*;

public class FileSize {
   public static void main(String[] args) {
      File f = new File("Vomito.txt"); //contient 150 caracteres
      Reader r;
      
      try {
         int c; //Valeur lue dans le fichier. 
         int counter = 0; //Nombre de caracteres lus au total
         System.out.println("Current/Default encoding is [" + System.getProperty("file.encoding") + "]"); //UTF-8 chez moi
         System.out.println();
         
         /*
          * Prendre tous les encodages existant sur le systeme, les definir sur le fichier, et comparer le 
          * nombre de caracteres lus avec la taille du fichier.
         */
         SortedMap<String, Charset> charSets = Charset.availableCharsets();
         Set<String> names = charSets.keySet();
         for(Iterator<String> e = names.iterator(); e.hasNext();) {
            String charsetName = e.next();
            if(!charsetName.equals("x-COMPOUND_TEXT")) { //Genere un BufferOverflow, je cherche encore la raison exacte
               r = new InputStreamReader(new BufferedInputStream(new FileInputStream(f)), charsetName);
               while((c = r.read()) != -1) { //Voici la bonne methode pour determiner la fin du flux
                  counter++;
               }
               String sCharset = "[" + charsetName + "]";
               String sFileSize = "File Size is [" + f.length() + "]";
               String sCharacterCount = "Character count is [" + counter + "]";
               System.out.printf("%21s - %18s - %s%23s%n", sCharset, sFileSize, sCharacterCount, f.length() == counter ? "" : "<---- Relation Fausse");
               counter = 0;
               r.close();
               r = null;
            }
         }
      } catch(IOException i) {
         i.getMessage();
      } finally {
         r = null;
         f = null;
      }
   }
}

++

Sandrew

Edit: Typo

Dernière modification par Sandrew (Le 08/03/2010, à 04:38)

Hors ligne

#3 Le 08/03/2010, à 19:07

rwikus090

Re : la taille des fichiers en java ?

merci pour votre aide, en clair faut pas faire confiance a la taille du fichier car sa dépendra de l'encodage et ce qui serait plus sécurisé et de voir jusqu'a ce que  la lecture du buffer nous retourne -1

Hors ligne