Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1286 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1004719
nlc
Le mieux est l'ennemi du bien
Posté le 08-03-2005 à 12:32:16  profilanswer
 

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
mood
Publicité
Posté le 08-03-2005 à 12:32:16  profilanswer
 

n°1004723
FlorentG
Unité de Masse
Posté le 08-03-2005 à 12:34:22  profilanswer
 

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
n°1004733
gedeon
Posté le 08-03-2005 à 12:40:00  profilanswer
 

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


Message édité par gedeon le 08-03-2005 à 12:40:44
n°1004746
nlc
Le mieux est l'ennemi du bien
Posté le 08-03-2005 à 12:53:25  profilanswer
 

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
n°1004757
nlc
Le mieux est l'ennemi du bien
Posté le 08-03-2005 à 13:12:30  profilanswer
 

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();
 }

n°1004758
Taz
bisounours-codeur
Posté le 08-03-2005 à 13:16:15  profilanswer
 

pourquoi tu lis char par char ? lis par bloc !

n°1004759
Taz
bisounours-codeur
Posté le 08-03-2005 à 13:17:33  profilanswer
 

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

n°1004764
nlc
Le mieux est l'ennemi du bien
Posté le 08-03-2005 à 13:28:34  profilanswer
 

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

n°1004765
Taz
bisounours-codeur
Posté le 08-03-2005 à 13:30:25  profilanswer
 
n°1004795
FlorentG
Unité de Masse
Posté le 08-03-2005 à 14:07:42  profilanswer
 

Et à quoi sert :

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


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

mood
Publicité
Posté le 08-03-2005 à 14:07:42  profilanswer
 

n°1006291
the real m​oins moins
Posté le 09-03-2005 à 01:45:43  profilanswer
 

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


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1006484
nlc
Le mieux est l'ennemi du bien
Posté le 09-03-2005 à 10:44:10  profilanswer
 

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+

n°1006486
Taz
bisounours-codeur
Posté le 09-03-2005 à 10:46:34  profilanswer
 

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.

n°1006500
nraynaud
lol
Posté le 09-03-2005 à 10:59:17  profilanswer
 


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


---------------
trainoo.com, c'est fini
n°1006571
cooltwan
Posté le 09-03-2005 à 11:33:15  profilanswer
 

regarde du coté de l'API nio

n°1006613
nlc
Le mieux est l'ennemi du bien
Posté le 09-03-2005 à 11:58:14  profilanswer
 

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
n°1006656
cooltwan
Posté le 09-03-2005 à 12:35:55  profilanswer
 

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


Message édité par cooltwan le 09-03-2005 à 12:36:07
n°1006709
nlc
Le mieux est l'ennemi du bien
Posté le 09-03-2005 à 13:18:23  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[resolu] [JSP][Tomcat 5] Problème lors du passage de paramètres ?[Résolu][HTML] Largeur de contenu d'une iframe
pb chemin d'accès à un fichier[VB]Manip fichier Excel+chemin depuis VB
[BATCH] Copie avec exception !?[java][Resolu] Probleme lecture de fichier
Quels logiciels pour creer Fichier/Edition/Affichage...?Ecrire le contenu d'une structure dans un fichier
Plus de sujets relatifs à : Lecture d'un fichier et copie dans un buffer, ultra lent ! [Resolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR