0

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

    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 方法之一来获取它,然后ImageIO.setUseCache(false);就可以了。

我对吗?

我该怎么做-我尝试使用ImageIO.createImageInputStream(imageURL);但出现异常:

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

那么,我该怎么做呢?

谢谢。

4

1 回答 1

1

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

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

您可以扩展这个想法,但提供诸如isCached(URL)getFile(URL)或什getInputStream(URL)至或getReader(URL)或您需要的东西

于 2012-08-06T09:26:46.900 回答