IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Pb. avec javax.imageio.ImageIO


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 093
    Par défaut Pb. avec javax.imageio.ImageIO
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputStream fluxIn = new URL(“http://.....truc.jpg”).openStream();
    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
    1
    2
    FileOutputStream OUT = new FileOutputStream(“chemin_fichier_de_sortie.jpg”);
    ImageIO.write(ImageIO.read(fluxIn), "jpg", OUT);
    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.
    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.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Au lieu de charger l'image en mémoire et de la resauvegarder, ce qui consomme temps et mémoire pour rien, charges/écris plutôt le flux directement (par InputStream/OutputStream), ce qui te permettra de gérer ton problème par la notion de timeout en plus.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 093
    Par défaut
    Merci pour votre réponse joel.drigo.
    Effectivement, je n'avais regardé cela d'assez près, mais ImageIO.read renvoie un BufferedImage, donc éffectivement, je charge la mémoire pour rien... Bien vu
    J'en ai profité pour regarder s'il existait une déclinaison de cette méthode qui me permettrait déviter cela, mais elles renvoient toutes la même chose, un BufferedImage.
    Dommage, lorsque j'ai découvert cette méthode, de prime abord, elle correspondait exactement à ce que je voulais et me permettait de minimiser au maximum les lignes de codes (je suis de nature fainéant)...
    Bref, si je comprends bien, ce que j'utilise est plutôt à utiliser pour de la visualisation que de la copie de fichier.
    Je voulais l'éviter, mais je vais suivre votre conseil et gérer le flux moi-même dans l'immédiat, ça m'apprendra à être trop fainéant parfois.
    Cependant, les images que je vais télécharger ainsi sont de petites tailles (800x800 en 72dpi pour les plus grandes au format Jpeg), et la machine qui va le faire a beaucoup de mémoire, donc je peux me permettre ce "gaspillage volontaire".
    Donc, je me permet de maintenir mon post ouvert pour la cas où quelqu'un saurait me dire s'il est possible de sortir de cette situation bloquante, et comment...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  4. #4
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 093
    Par défaut
    Bonsoir,
    J'ai modifié mon code et abandonné ImageIO. Je n'utilise plus qu'un flux d'entrée de type InputStream, et un flux de sortie FileOutputStream. Je n'utilise plus la méthode openStream() de URL, mais la méthode openConnection() afin de récupérer un URLConnection. Je règle le timeout pour la lecture via la méthode setReadTimeout(500), si je ne me trompes pas, cela fait une demie seconde.
    Voilà le code que ça donne :

    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
        private boolean ecritureFichierREV2(URLConnection url, FileOutputStream OUT, String ref) {
            boolean reponse;
            try {
                InputStream fluxIn = url.getInputStream();
                System.out.println("Valeur du ReadTimeOut : " + url.getReadTimeout());  // Un setTimeout(500) a été fait dans le code appelant lors de la construction de url.
                while (fluxIn.available() != 0) OUT.write(fluxIn.read());
                OUT.flush();
                OUT.close();
                reponse = true;
                }
            catch (IOException e) {
                reponse = false;
                }
            return reponse;
            }
    Et bien, ça fonctionne exactement de la même manière. Cela va évidemment plus vite, et consomme significativement moins de mémoire, mais ça bloque exactement de la même manière ?!...
    Le cas qui me préoccupe c'est lorsque la connexion est établie et active, fluxIn.read() est exécuté, et le Socket sous-jacent se met à attendre des données sur son port, mais rien ne vient. Le code lui aussi attend...
    Je pensais qu'avec le préparation apportée à mon instance de URLConnection lèverait une java.net.SocketTimeoutException, mais ce n'est pas le cas ???....

    Si quelqu'un a une idée ?
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  5. #5
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 093
    Par défaut
    Je suis vraiment désolé, mais je suis un âne.
    Il n'y a en fait aucun problème si ce n'est une mauvaise gestion de flux de ma part. Au mieux, ce post n'est pas dans le bon forum.
    Quoi qu'il en soit, avec le conseil donné, et un test de contrôle de flux adapté, tout fonctionne à merveille.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec javax/mail
    Par mahhour dans le forum NetBeans
    Réponses: 1
    Dernier message: 18/07/2007, 13h12
  2. probleme avec javax.servlet.jsp.tagext.Tag
    Par faico dans le forum JSF
    Réponses: 2
    Dernier message: 30/03/2007, 11h38
  3. blocage de l'application avec javax.comm
    Par caloun62 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 19/03/2007, 19h59
  4. probelem avec javax*
    Par hind28 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 20/02/2007, 09h57
  5. Décrocher avec javax.comm
    Par gskoala dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 08/04/2006, 21h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo