使用ImageIO静态方法使用缓存

时间:2012-08-06 08:49:49

标签: java file caching download javax.imageio

我需要从给定的网址下载文件,但问题是我可以获取没有扩展名的文件。 为了弄清楚扩展是什么,我写了以下服务:

    public String getExtension(String imageURL){
        InputStream stream = new URL(imageURL).openStream();
        ImageInputStream iis = ImageIO.createImageInputStream(stream);
        Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
        ImageReader reader = imageReaders.next();
        String retVal      = reader.getFormatName();
        closeInputStreamAndDisposeReader(reader);
        return retVal;
    }

稍后我需要下载该图片,所以我写道:

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

问题是我正在下载文件两次 - 我想使用缓存来防止这种情况。现在我读到了ImageIO.setUseCache(false);,但似乎没有用(也许我在这里做错了)。

修改: 我注意到我使用new URL(imageURL).openStream()创建输入流 - 这是我正在进行的第一次下载,我认为我应该使用其中一种ImageIO方法来获取它,然后使用{{1}会工作的。

我是对的吗?

我该怎么做 - 我试图使用ImageIO.setUseCache(false);,但我得到了一个例外:

ImageIO.createImageInputStream(imageURL);

那么,我该怎么做?

感谢。

1 个答案:

答案 0 :(得分:1)

我过去所做的是使用Map支持的缓存,它基本上将URL作为File引用的关键字作为值。

基本上我要做的是通过URL从缓存中请求Image。如果图像已经下载(并且它满足一些其他要求),它将返回文件系统上存在的图像,否则,它将下载并放入缓存中。

您可以扩展这个想法,但提供isCached(URL)getFile(URL)甚至getInputStream(URL)getReader(URL)或者您需要的内容