这个调用是否应该是阻塞的,因为它确保在执行“全部”流之后它已被读取了?
BufferedImage image = ImageIO.read(inputStream);
我正在使用位于调用ImageIO.read()
参数和“真实”源(例如,FileInputStream)之间的FilterInputStream,假设如上所述,但似乎存在一些竞争条件 - 难以重现。有时,在语句执行后,流只会消耗一半。
还有第二个相关的疑问:“全部”图像流的定义可能是模糊的,考虑例如PNG图像,在像素数据之后可以有一些额外的元数据(在IEND块之前发出信号的真实结束)图像流)。我可以期望ImageIO.read()
将读取(除了竞争条件)所有图像,还是会发生该方法仅消耗获取像素值所需的内容?
答案 0 :(得分:3)
好吧,ImageIO
API没有说明这一点。它确实明确保证图像加载过程将完成。但是,由于BufferedImage
类的API中没有任何内容处理异步加载(如某些isLoaded()
方法),因此可以合理地假设如果在后台进行异步加载, 应透明。 (如果没有,那就是实施中的一个错误!)
无论如何,解决您怀疑的方法是查看图像阅读器的源代码。如果它被设计为进行异步加载,那将是显而易见的。
(我怀疑问题出在其他地方。也许你的过滤器流或它过滤的流不是线程安全的,你有多个应用程序线程试图使用它/它们?)
我可以期望ImageIO.read()会读取(除了竞争条件)所有图像,还是会发生该方法只消耗获取像素值所需的内容?
我认为你不能认为ImageIO.read()
会读取整个流。它不是规范的一部分,并且(一般而言)读取的内容比填充BufferedImage
所需的效率低。