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

  FORUM HardWare.fr
  Programmation
  Java

  [java] performance d'une copie de fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[java] performance d'une copie de fichier

n°769155
candide2
Posté le 18-06-2004 à 15:13:47  profilanswer
 

Mon jar executable doit copier, vers un DD, un fichier(400ko) qui est inclus dans l'archive.
 
Je le fais avec :
     InputStream is = getClass().getResourceAsStream(inputFileName);
      OutputStream os = new FileOutputStream(outputFileName);
       
      int b;  // byte readed in the file
      while((b = is.read()) != -1) {
        os.write(b);
      }
      is.close();
      os.close();

 
Si c'est un DD local, rien d'horrible mais c'est très long vers le DD d'un serveur.
 
J'ai essayé aussi :
      FileChannel srcChannel = new FileInputStream(inputFileName).getChannel();
      // Create channel on the destination
      FileChannel dstChannel = new FileOutputStream(outputFileName).getChannel();
       
      // Copy file contents from source to destination
      dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
       
      // Close the channels
      srcChannel.close();
      dstChannel.close();

 
mais ça ne marche pas en lecture dans le jar.
Y a t'il d'autres méthodes ?

mood
Publicité
Posté le 18-06-2004 à 15:13:47  profilanswer
 

n°769590
julienv
Posté le 18-06-2004 à 20:59:07  profilanswer
 

Premierement essaie de mettre un BufferedOutputStream devant le FileOutputStream :
 
out = new BufferedOutputStream(new FileOutputStream(....));
 
Deuxiement evite de copier octet par octet et utilise un tableau :
 
byte[] buffer = new byte[256];
int q = in.read(buffer);
while (q != -1)
{
out.write(buffer, 0, q);
q = in.read(buffer);
}

n°769601
Taz
bisounours-codeur
Posté le 18-06-2004 à 22:10:52  profilanswer
 

256 c'est pas beaucoup... moi je dis au minimum 4096

n°769603
jagstang
Pa Capona ಠ_ಠ
Posté le 18-06-2004 à 22:11:00  profilanswer
 

+1
 
sacré gain de temps. voici les deux version
 

Code :
  1. // -----------------------------------------------------------------
  2.   // Copie bit à bit d'un fichier (accès disque)
  3.   // -----------------------------------------------------------------  
  4.   // 272112 ms (34 Mo)
  5.   start.setTime(new Date());
  6.   fis = new FileInputStream("hello.txt" ) ;   // source
  7.   fos = new FileOutputStream("empty.txt" ) ;  // destintation
  8.   int b ;
  9.   while ((b = fis.read()) != -1)
  10.    fos.write(b) ;
  11.   fis.close() ;
  12.   fos.close() ;
  13.   System.out.println("copie ok" ) ;
  14.   stop.setTime(new Date());
  15.   System.out.println("runtime : " + (stop.getTimeInMillis() - start.getTimeInMillis()) + " ms" ) ;
  16.   // -----------------------------------------------------------------
  17.   // Copie bit à bit d'un fichier + buffer (copie mémoire du fichier)
  18.   // -----------------------------------------------------------------
  19.   // 7350 ms (34 Mo)
  20.   start.setTime(new Date());
  21.   fis = new FileInputStream("hello.txt" ) ;   // source
  22.   BufferedInputStream bis = new BufferedInputStream(fis) ;
  23.   fos = new FileOutputStream("empty.txt" ) ;  // destintation
  24.   BufferedOutputStream bos = new BufferedOutputStream(fos) ;
  25.   //int b ;  
  26.   while ((b = bis.read()) != -1)
  27.    bos.write(b) ;
  28.   bis.close() ;
  29.   bos.close() ;
  30.   fis.close() ;
  31.   fos.close() ;
  32.   System.out.println("copie ok" ) ;
  33.   stop.setTime(new Date());
  34.   System.out.println("runtime : " + (stop.getTimeInMillis() - start.getTimeInMillis()) + " ms" ) ;


Message édité par jagstang le 18-06-2004 à 22:11:27

---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°769604
jagstang
Pa Capona ಠ_ಠ
Posté le 18-06-2004 à 22:11:57  profilanswer
 

Taz, j'attends tes remarques :D


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°769621
Taz
bisounours-codeur
Posté le 18-06-2004 à 22:31:55  profilanswer
 

que tu peux pas comparer aussi simplement à cause de la bufferisation de ton système de fichiers / OS

n°769653
jagstang
Pa Capona ಠ_ಠ
Posté le 18-06-2004 à 23:57:24  profilanswer
 

tu me deçois :o


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°769754
julienv
Posté le 19-06-2004 à 03:16:27  profilanswer
 

256 / 4096, ca changera pas grand chose.  
 
Le vrai gain vient de la bufferisation apres 256 ou 4096 impliquera un nombre de passage dans la boucle plus ou moins important. Par contre en mettant 1 c est pas forcement une bonne chose.
 
Essaie aussi de mettre un BufferInputStream en entree si ton fichier ne vient pas d un jar (je pense que les fichiers qui viennent des jar sont deja bufferises )

n°769755
julienv
Posté le 19-06-2004 à 03:17:50  profilanswer
 

arf j ai pas vu que tu l avais mis dans ton code (le BufferedInputStream) :-)

n°769756
julienv
Posté le 19-06-2004 à 03:18:56  profilanswer
 

rqe // a Taz, la il a meme pas utilise de tableau dans son code

mood
Publicité
Posté le 19-06-2004 à 03:18:56  profilanswer
 

n°769767
candide2
Posté le 19-06-2004 à 08:23:14  profilanswer
 

Merci à tous pour votre aide
je referai des tests lundi au boulot.
Bon WE

n°774237
candide2
Posté le 23-06-2004 à 13:53:54  profilanswer
 

J'ai fait des tests juste en ajoutant la bufferisation. C'est parfait
Dans mon cas, je passe de 200s à 1.5s
Merci encore.


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

  [java] performance d'une copie de fichier

 

Sujets relatifs
Utiliser une variable dans un autre fichier[Java]oloriser de manière différente différentes parties d'un textArea
Php & Mysql ou Php et fichier texteSupprimer les fichier contenu ds Temp avec un .bat a chaque reboot??
Modifier un fichier Excel[Java] coincé avec un gridbagLayout
ouverture de fichierenorme dump mysql a partir d un fichier sur le serveur meme
pb transfert fichier -socket VC++6[excel] copie et insertion de colonnes
Plus de sujets relatifs à : [java] performance d'une copie de fichier


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