2012-08-06 102 views
0

我需要從給定的URL下載文件,但事情是我可以得到沒有擴展名的文件。 爲了弄清楚擴展名是什麼,我寫了下面的服務:使用ImageIO靜態方法緩存

後來我需要下載圖片,因此我這樣寫道:

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) 

那麼,我該怎麼辦呢?

謝謝。

+1

做,後來從中讀取上?或者讓'image'成爲一個實例字段? – Raffaele 2012-08-06 08:56:18

+0

我需要從給定的URL獲取inputStream並在稍後對其進行讀取 – Noam 2012-08-06 09:19:59

+0

嘗試'ImageIO.createImageInputStream(imageURL.openStream())'。我認爲一旦你做完了這些,緩存「應該」適用於你,因爲從我讀過的內容中可以看出它適用於'ImageInput/OutputStream' – MadProgrammer 2012-08-06 09:29:52

回答

1

我過去所做的是使用Map支持的緩存,它基本上將URL作爲關鍵字File引用作爲值。

基本上我會做的是通過URL從緩存中請求Image。如果圖像已經被下載(並且滿足一些其他要求),則它返回文件系統上存在的圖像,否則它將其下載並放入緩存。

你可以擴展的想法,但提供的東西像isCached(URL)getFile(URL)甚至getInputStream(URL)getReader(URL)或者是你需要,你需要幫助寫的`InputStream`到一個臨時文件什麼都