2012-08-06 4 views
0

Je dois télécharger un fichier à partir d'une URL donnée, mais le problème est que je peux obtenir des fichiers sans extension. Afin de comprendre ce que l'extension est j'ai écrit le service suivant:Utilisation du cache à l'aide des méthodes statiques ImageIO

Plus tard, je dois télécharger cette image j'ai donc écrit:

BufferedImage image = ImageIO.read(imageURL); 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    ImageIO.write(image, extension, byteArrayOutputStream); 
    byteArrayOutputStream.flush(); 
    byte[] imageInBytes = byteArrayOutputStream.toByteArray(); 
    byteArrayOutputStream.close(); 

Le problème est que je suis dowloading le fichier deux fois - et je voudrais utiliser le cache afin d'éviter cela. Maintenant, je lis à propos de ImageIO.setUseCache(false); mais cela ne semble pas fonctionner (peut-être que je fais quelque chose de mal ici).

Modifier: J'ai remarqué que je crée le flux d'entrée en utilisant new URL(imageURL).openStream() - c'est le premier téléchargement que je fais, je pense que je l'ai utilisé l'une des méthodes ImageIO pour obtenir que puis le ImageIO.setUseCache(false); fonctionnerait.

Ai-je raison?

Comment puis-je faire cela - j'ai essayé d'utiliser le ImageIO.createImageInputStream(imageURL); mais je suis une exception:

java.lang.IllegalArgumentException: input == null! 
at javax.imageio.ImageIO.createImageInputStream(Unknown Source) 

Alors, comment puis-je faire?

Merci.

+1

Avez-vous besoin d'aide pour écrire un 'InputStream' dans un fichier temporaire et la lecture de celui-ci plus tard sur? Ou faire 'image' un champ d'instance? – Raffaele

+0

Je dois obtenir cette entréeStream d'une URL donnée et en lire plus tard – Noam

+0

Essayez 'ImageIO.createImageInputStream (imageURL.openStream())' à la place. Je pense qu'une fois que vous avez fait cela, le cache "devrait" fonctionner pour vous, à partir de ce que j'ai lu cela fonctionne avec 'ImageInput/OutputStream' – MadProgrammer

Répondre

1

Ce que j'ai fait dans le passé est d'utiliser un cache sauvegardé Map, qui prend fondamentalement l'URL comme clé une référence File comme valeur.

Fondamentalement ce que je ferais est de demander un Image du cache via une URL. Si l'image a déjà été téléchargée (et qu'elle remplit quelques autres conditions), elle renvoie l'image qui existe sur le système de fichiers, sinon elle la télécharge et la place dans le cache.

Vous pouvez étendre l'idée, mais fournir des choses comme isCached(URL) et getFile(URL) ou même getInputStream(URL) ou getReader(URL) ou ce que jamais il est vous avez besoin

Questions connexes