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();

問題は、ファイルを 2 回ダウンロードしていることです。それを防ぐためにキャッシュを使用したいと考えています。今読んだのですImageIO.setUseCache(false);が、うまくいかないようです(おそらく、ここで何か間違ったことをしているのでしょう)。

編集: を使用して入力ストリームを作成していることに気付きましnew URL(imageURL).openStream()ImageIO.setUseCache(false);

私は正しいですか?

どうすればそれを行うことができますか - を使用しようとしましたImageIO.createImageInputStream(imageURL);が、例外が発生しました:

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

それで、どうすればそれを行うことができますか?

ありがとう。

4

1 に答える 1

1

私が過去に行ったことは、基本的に URL をキーとして参照し、値として参照する、 Mapbacked Cache を使用することです。File

基本的に私がすることはImage、URL を介してキャッシュからリクエストすることです。イメージが既にダウンロードされている場合 (および他のいくつかの要件を満たしている場合)、ファイル システムに存在するイメージを返します。それ以外の場合は、イメージをダウンロードしてキャッシュに配置します。

アイデアを拡張することもできますが、必要なものを提供するisCached(URL)ことgetFile(URL)getInputStream(URL)できgetReader(URL)ます

于 2012-08-06T09:26:46.900 に答える