Bonjour,
J'ai un programme qui a pour fonctionnalité de télécharger un fichier depuis un serveur. Le fichier est plus ou moins gros et le débit est plus ou bon (cela peut aller de quelques octets par secondes à quelques Mo par secondes.
J'ai commencé par développer un classe qui lance un Thread. Ce Thread contient toute la routine pour télécharger le fichier. Cela fonctionne très bien. Je souhaite ajouter une fonctionnalité. Cette fonctionnalité consiste à pouvoir arrêter à tout moment le téléchargement. Pour cela j'ai mis en place dans mon Thread un booléen qui est passé à true dès que je veux annuler le téléchargement. Dans ma boucle si le booléen est à true, je quitte la boucle.
Voici un exemple allégé du code :
Ceci est le contenu simplifié de ma classe permettant de télécharger le fichier. Dans cette version, le fichier n'est pas enregistré sur le disque.
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
19
20
21
22
23
24
25
26
27
28
29
30
31
32 import java.io.InputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; public class Download implements Runnable { private boolean killMe = false; @Override public void run() { String host = "http://www.domaine.com/fichier.txt"; InetAddress addr = InetAddress.getByName(host); int port = 80; SocketAddress sockaddr = new InetSocketAddress(addr, port); Socket sock = new Socket(); int timeoutMs = 5000; // 5s sock.connect(sockaddr, timeoutMs); private byte[] buffer = new byte[32 * 1024]; InputStream input = sock.getInputStream(); do { bufferRead = input.read(buffer); } while ((bufferRead != -1) && !killMe); } public void killMe() { killMe = true; } }
Tout se passe bien dans la majorité des cas, j'appelle la fonction killMe et le téléchargement se stoppe plus ou moins rapidement. Et c'est là où est mon problème... plus le débit est lent ou instable, plus il va être long à s’arrêter. J'ai remarqué que le programme bloqué plus facilement pendant quelques secondes voir minutes(!) sur la ligne :
Cela empêche l'utilisateur de quitter le téléchargement du fichier... comment je peux améliorer cette partie ? J'ai testé le package NIO mais ça me fait exactement pareil, j'ai mal fait ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 bufferRead = input.read(buffer);
Merci pour votre aide.
Partager