ImageIO.read()是否异步?

时间:2013-07-21 02:57:39

标签: java javax.imageio

这个调用是否应该是阻塞的,因为它确保在执行“全部”流之后它已被读取了?

 BufferedImage image = ImageIO.read(inputStream);

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

  

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

我认为你不能认为ImageIO.read()会读取整个流。它不是规范的一部分,并且(一般而言)读取的内容比填充BufferedImage所需的效率低。

相关问题