2013-07-21 51 views
3

這個調用應該是阻塞的,從這個意義上說,它保證了在執行完所有的流之後?ImageIO.read()是異步的嗎?

BufferedImage image = ImageIO.read(inputStream); 

我與呼叫ImageIO.read()參數,「真正的」源(比如,一個FileInputStream)之間坐在一個FilterInputStream打,假設之上,但似乎有一些競態條件 - 難以重現。有時,流在語句執行後只顯示一半消耗。還有第二個相關的疑問:圖像流的「全部」的定義可能是模糊的,例如考慮PNG圖像,在像素數據可以具有一些額外的元數據之後(在IEND組塊之前,的圖像流)。我可以期望ImageIO.read()將讀取(除了競爭條件)所有圖像,還是可能發生該方法只消耗獲得像素值所需的內容?

回答

3

那麼,ImageIO API不會說這個。它明確保證圖像加載過程將完成。然而,由於BufferedImage類的API中沒有處理異步加載的API(如某些isLoaded()方法),所以假設如果在幕後發生異步加載是合理的,則應爲應該是透明的。 (如果沒有的話,這是實施中的一個錯誤!)

無論如何,解決您懷疑的方法是查看圖像閱讀器的源代碼。如果它被設計成執行異步加載,那將是顯而易見的。

(我懷疑,這個問題是在其他地方。也許你的過濾器流或者被過濾的流不是線程安全的,你有多個應用程序線程試圖使用它/它們?)

我可以期待ImageIO.read()能夠讀取(除了競爭條件)所有圖像,還是會發生這種方法只會消耗獲取像素值所需的內容?

我不認爲你可以認爲ImageIO.read()將讀取整個流。它不是規範的一部分,並且(一般來說)讀取比填充BufferedImage所需的更多的信息是低效的。

+0

你在這兩方面看起來都對。我的問題是由於第二個問題;不是一個錯誤,而是......「[這是低效率的讀取超過必要的填充],嗯,嚴格地說,沒有IEND塊的PNG格式不正確,但我想沒人真的檢查這些東西... – leonbloy

+0

@leonbloy - 我說的另一種說法是,執行應用程序不需要的額外驗證是低效的。如果應用程序只需要圖像部分,那麼後面的東西*的有效性可能*無關緊要。 (事實上​​,PNG格式設計師可能會把這些東西放在最後,以便在大多數情況下可以避免*讀取/解析它。) –