Lecture d'un fichier et copie dans un buffer, ultra lent ! [Resolu]

Lecture d'un fichier et copie dans un buffer, ultra lent ! [Resolu] - Java - Programmation

Marsh Posté le 08-03-2005 à 12:32:16    

Bonjour a tous
 
J'ai crée une classe Fichier dans la laquelle j'ai une methode lire() qui doit lire le fichier complet et me retourner une string.
 
Pour les fichiers court ca va bien, mais j'ai des fichiers jusqu'a 1Mo et la ca ca devient impossible tellement c'est lent !
 
voila le code de la methode lire :
 
public String lire (){
 String maString = "";
 
 try {
  FileInputStream fr = new FileInputStream(this);
         BufferedInputStream br = new BufferedInputStream( fr );
         
  while ( br.available() != 0 ) {
   maString += (char)(br.read()&0xFF);
  }
 
  br.close ();
 
         System.out.println ( "Le fichier lu contient " + maString.length() + " octets" );  
  } catch ( IOException e) {
   System.out.println (e.getMessage ());
   maString = "";
  }
   
  return maString;
 }
 
Je suppose que c'est lent car je lis les octets 1 par 1, et concatener la chaine au fur et a mesure doit devenir de plus en plus lent.
Mais comment faire autrement ?
La string retournée peut donc faire jusqu'a 1Mo et les fichiers peuvent etre binaires.
 
Bonne journée a tous !


Message édité par nlc le 09-03-2005 à 11:01:47
Reply

Marsh Posté le 08-03-2005 à 12:32:16   

Reply

Marsh Posté le 08-03-2005 à 12:34:22    

Voilà, tu concatène avec une String normale, spabien. La première optimisation qu'on t'apprend à l'école, c'est d'utiliser un StringBuilder, et sa méthode append :)


Message édité par FlorentG le 08-03-2005 à 12:34:32
Reply

Marsh Posté le 08-03-2005 à 12:40:00    

Le pb vient probablement du fait que tu utilise une chaine
 
re donc !


Message édité par gedeon le 08-03-2005 à 12:40:44
Reply

Marsh Posté le 08-03-2005 à 12:53:25    

Ben le pb c'est justement j'apprends le java par moi meme...
Donc j'ai pas appri le StringBuilder... :(
 
Le truc c'est que je dois imperativement utiliser une chaine en retour (qui peut effectivement etre grosse, jusqu'a 1Mo)
 
Y'a pas un moyen par exemple de lire tout d'un coup le fichier dans un tableau puis convertir le tableau en string ?
 
C'est dur le java !
Je vais jeter un oeil a StringBuilder pour voir


Message édité par nlc le 08-03-2005 à 12:53:58
Reply

Marsh Posté le 08-03-2005 à 13:12:30    

Bon ben c'est impeccable, voici mon nouveau code et maintenant le temps de lecture/creation chaine = environ 10s pour 512Ko. Donc c'est deja bien mieux !
 
Merci encore
 
 :bounce:  
 
 
 public String lire (){
  //String maString = "";
  StringBuffer maString = new StringBuffer("" );
 
  try {
   FileInputStream fr = new FileInputStream(this);
         BufferedInputStream br = new BufferedInputStream( fr );
         
         System.out.println ( "Lecture du fichier '" + nomCompletFichier + "'" );  
 
   while ( br.available() != 0 ) {
    char c = (char)(br.read()&0xFF);
    maString.append( c );
   }
 
   br.close ();
 
         System.out.println ( "Le fichier lu contient " + maString.length() + " octets" );  
  } catch ( IOException e) {
   System.out.println (e.getMessage ());
   return( "" );
  }
   
  return maString.toString();
 }

Reply

Marsh Posté le 08-03-2005 à 13:16:15    

pourquoi tu lis char par char ? lis par bloc !

Reply

Marsh Posté le 08-03-2005 à 13:17:33    

NB : si une exception survient, tu pers un descripteur de fichier (.close() pas appelée)

Reply

Marsh Posté le 08-03-2005 à 13:28:34    

Oui j'y pensé a lire par bloc, mais je vois pas trop comment faire. COmme je suis vraiement debutant en java j'ai pas encore toutes les astuces.
 
Exact pour le .close() et l'exception, je vais etudier ca
 
Merci

Reply

Marsh Posté le 08-03-2005 à 13:30:25    

Reply

Marsh Posté le 08-03-2005 à 14:07:42    

Et à quoi sert :

char c = (char)(br.read()&0xFF);


:??:
Pourquoi tu fais un masque avec &0xFF ?

Reply

Marsh Posté le 08-03-2005 à 14:07:42   

Reply

Marsh Posté le 09-03-2005 à 01:45:43    

bah surtout, pourquoi il utilise pas un Reader ...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-03-2005 à 10:44:10    

Oui le masque sert plus a rien car je convertis le int en char.
 
Il est resté d'un autre essai ou je faisais diverses experiences.
 
Pour the real moins moins : Ben parce que je debarque en java et j'y connais que dalle !! :)
 
A+

Reply

Marsh Posté le 09-03-2005 à 10:46:34    

rien à voir avec Java. tu fais une lecture char par char sans tester EOF mais en utilisant .available() ... y pas plus lent quelque soit le langage.

Reply

Marsh Posté le 09-03-2005 à 10:59:17    


tu aurais peut-être dû la lire cette page avant de lui dire de la lire [:petrus75]


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 09-03-2005 à 11:33:15    

regarde du coté de l'API nio

Reply

Marsh Posté le 09-03-2005 à 11:58:14    

Mais ne vous inquietez plus, ca marche bien a present !
 
Je lis effectivement caractere par caractere, mais avec StringBuffer la concatenation est rapide donc ca met maxi 10s a charger un fichier. Donc ca me convient bien.
 
Merci encore pour vos aides
A+


Message édité par nlc le 09-03-2005 à 11:58:37
Reply

Marsh Posté le 09-03-2005 à 12:35:55    

tente avec nio quand meme ca booste bien et la modif est legere


Message édité par cooltwan le 09-03-2005 à 12:36:07
Reply

Marsh Posté le 09-03-2005 à 13:18:23    

Je verrai ca dans la prochaine release du soft !  ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed