3

这个调用是否应该被阻塞,因为它保证在它执行之后“所有”流已经被读取?

 BufferedImage image = ImageIO.read(inputStream);

假设上述情况,我正在使用位于调用ImageIO.read()参数和“真实”源(例如 FileInputStream)之间的 FilterInputStream,但似乎存在一些竞争条件 - 难以重现。有时,在语句执行后,流似乎只消耗了一半。

还有第二个相关的疑问:“所有”图像流的定义可能是模棱两可的,例如考虑 PNG 图像,在像素数据之后可以有一些额外的元数据(在指示图像流真正结束的 IEND 块之前)。我是否可以期望它ImageIO.read()会读取(除了竞争条件)所有图像,还是该方法仅消耗获取像素值所需的内容?

4

1 回答 1

3

好吧,ImageIOAPI 没有说明这一点。它确实明确保证图像加载过程将完成。但是,由于BufferedImage类的 API 中没有处理异步加载的任何内容(如某些isLoaded()方法),因此可以合理地假设,如果在后台进行异步加载,它应该是透明的。(如果没有,那是实现中的一个错误!)

无论如何,解决您的怀疑的方法是查看图像阅读器的源代码。如果它设计为异步加载,那将是显而易见的。

(我怀疑问题出在其他地方。也许您的过滤器流或它正在过滤的流不是线程安全的,并且您有多个应用程序线程试图使用它/它们?)

我可以期望 ImageIO.read() 将读取(除了竞争条件)所有图像,还是该方法仅消耗获取像素值所需的内容?

我认为您不能假设ImageIO.read()它将读取整个流。它不是规范的一部分,并且(通常)阅读比填充BufferedImage.

于 2013-07-21T03:17:33.090 回答