performance d'une copie de fichier [java] - Java - Programmation
Marsh Posté le 18-06-2004 à 20:59:07
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);
}
Marsh Posté le 18-06-2004 à 22:11:00
+1
sacré gain de temps. voici les deux version
Code :
|
Marsh Posté le 18-06-2004 à 22:11:57
Taz, j'attends tes remarques
Marsh Posté le 18-06-2004 à 22:31:55
que tu peux pas comparer aussi simplement à cause de la bufferisation de ton système de fichiers / OS
Marsh Posté le 18-06-2004 à 23:57:24
tu me deçois
Marsh Posté le 19-06-2004 à 03:16:27
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 )
Marsh Posté le 19-06-2004 à 03:17:50
arf j ai pas vu que tu l avais mis dans ton code (le BufferedInputStream) :-)
Marsh Posté le 19-06-2004 à 03:18:56
rqe // a Taz, la il a meme pas utilise de tableau dans son code
Marsh Posté le 19-06-2004 à 08:23:14
Merci à tous pour votre aide
je referai des tests lundi au boulot.
Bon WE
Marsh Posté le 23-06-2004 à 13:53:54
J'ai fait des tests juste en ajoutant la bufferisation. C'est parfait
Dans mon cas, je passe de 200s à 1.5s
Merci encore.
Marsh Posté le 18-06-2004 à 15:13:47
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 ?