Bonsoir,
J’essai d’écrire une routine dont l’objectif est de récupérer une image au format Jpeg à travers une URL de type http. Pour cela, j’exploite la méthode « openStream() » de la classe java.net.URL :
Ensuite, j’exploite la méthode « write(RenderedImage in, String formatName, OutputStream output) » de la classe javax.imageio.ImageIO :
Code : Sélectionner tout - Visualiser dans une fenêtre à part InputStream fluxIn = new URL(http://.....truc.jpg).openStream();
J’ai fait plusieurs essais pour remarquer deux cas de figures particuliers. Le premier cas se produit lorsque la méthode « ImageIO.read(fluxIn) » renvoie null. Cela peut être du à une coupure de la connexion, ou une déconnexion du serveur. Dans ce cas, pas de problème puisqu’une exception est levée au niveau de ImageIO.write. Mais il y a un second cas, lorsqu’il n’y a pas de fermeture de connexion, mais qu’aucune donnée n’arrive ?! Dans ce cas, mon code bloque, et tant que la connexion n’est pas fermée par le tiers, alors mon code reste bloqué… Il me faut donc trouver un moyen de sortir de ce blocage lorsque ce cas se produit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 FileOutputStream OUT = new FileOutputStream(chemin_fichier_de_sortie.jpg); ImageIO.write(ImageIO.read(fluxIn), "jpg", OUT);
J’ai essayé de voir au niveau ImageIO un rapport avec une notion de timeout, mais je n’ai rien trouvé. Donc, je me suis dit que je n’avais pas d’autre choix que de surveiller le fichier de sortie pour remarquer que dans ce cas, un joli fichier jpeg vide, de taille nulle est créé. Donc, j’ai trouvé un moyen de surveiller la taille de ce fichier pendant qu’il se télécharge. Mon mécanisme est simple, je crée un Thread à partir d’une de mes classes qui implémente Runnable en fournissant à ce dernier le flux d’entrée, le flux de sortie et une référence de traitement sous forme de String. Ce Thread a pour rôle de remarquer l’absence d’évolution du fichier de sortie pendant un certain temps. Il est exécuté juste avant la méthode write de ImageIO.
Ce mécanisme fonctionne, mais je ne trouve pour autant aucun moyen de sortir de la méthode ImageIO.write(ImageIO.read(fluxIn), « jpg », OUT) … C’est pourquoi j’ai passé fluxIn à mon Thread, je me suis dit qu’en invoquant sa méthode reset, ou close j’arriverai à lever une exception auprès d’ImageIO, mais il n’en est rien ?!
Bref, je sèche complètement… Si quelqu’un a une idée pour débloquer cette situation, cela m’aiderai beaucoup.
Merci à vous.
Partager