Bonjour,
J'ai un souci pour connaitre l'état d'écriture d'un fichier.
Plus clairement, j'ai une appli qui permet de compresser des fichiers quelconques.
Au niveau de l’écriture je fais un read de 1024 sur le fichier et j'écris ces 1024 octets dans mon archive. C'est très rapide.
J'ai ensuite voulu connaitre la progression(en %) de l'archive pour pouvoir en informer l'utilisateur et mon premier réflexe fut de faire un read de 1:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 static private void generateArchive(OutputStream out, InputStream in) throws IOException { byte buf[] = new byte[1024]; try { for (int len = 0; (len = in.read(buf)) > 0;) out.write(buf, 0, len); } catch (IOException e) { e.printStackTrace(); } finally { in.close(); } }
Mais comme vous pouvez vous en doutez, non seulement le read(1) est moche mais il est surtout 1024 fois plus lent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 static private void generateArchive(OutputStream out, InputStream in, int fileLen) throws IOException { byte buf[] = new byte[1]; // buffer int prog; // progression try { for (int len = 0, ct = 0; (len = in.read(buf)) > 0; ++ct) { // ct => counter; len => lenght out.write(buf, 0, len); prog = Math.round(((float)ct/ (float)fileLen) * 100); // prog étant la valeur en pourcentage a ce stade (exemple: 50 %) } } catch (IOException e) { e.printStackTrace(); } finally { in.close(); } }
Donc est-ce que vous auriez un autre moyen de connaitre le l’état actuelle d’écriture sans perdre trop de vitesse ?
merci.
Partager