javax.imageio.ImageReader加载相同的图像并覆盖

javax.imageio.ImageReader加载相同的图像并覆盖,java,javax.imageio,Java,Javax.imageio,我有一些使用ImageReader类读取大量TIF图像的代码。imageReader对象是最终的,并在构造函数中创建 synchronized(imageReader) { LOG.debug(file); FileInputStream fin = new FileInputStream(file); ImageInputStream iis = ImageIO.createImageInputStream(fin); imageReader.setInput(

我有一些使用ImageReader类读取大量TIF图像的代码。
imageReader
对象是最终的,并在构造函数中创建

synchronized(imageReader) {
    LOG.debug(file);
    FileInputStream fin = new FileInputStream(file);
    ImageInputStream iis = ImageIO.createImageInputStream(fin);
    imageReader.setInput(iis, false);
    int sourceXSubSampling = targetSize == null ?
            1 : Math.max(1, imageReader.getWidth(0) / targetSize.width);
    int sourceYSubSampling = targetSize == null ?
            1 : Math.max(1, imageReader.getHeight(0) / targetSize.height);
    ImageReadParam subSamplingParam = new ImageReadParam();
    subSamplingParam.setSourceSubsampling(sourceXSubSampling, sourceYSubSampling, 0, 0);
    return imageReader.read(0, subSamplingParam);
}
大约四分之一的情况下,ImageReader在加载的第一个图像上“卡住”,并不断地反复加载同一图像,即使它提供了不同的ImageInputStreams。记录器的输出证明了这一点


我该如何解决这个问题。我在考虑对图像进行“指纹”处理,如果出现这种情况,从迭代器中获取不同的图像读取器,但这似乎有些过头了。有人知道如何解决这个问题吗?

正如@MadProgrammer在评论部分所说,读取多个图像的典型模式是为每个图像获取一个新的
ImageReader
,然后
dispose()
读取它。与实际读取图像相比,创建读取器实例所花费的时间/内存非常少。因此,任何性能损失都应该可以忽略不计


但是,理论上,在每次
读取之前/之后,在
图像读取器上调用
reset()
就足够了

1-关闭你的溪流;2-阅读完毕后,将阅读器处理掉;3-每次都要求一个“新”的读者。可能无法解决问题,但不会造成伤害…实际上,您不需要额外的
FileInputStream
,只需直接调用
ImageIO.createImageInputStream(file)
。然后,您不必关闭它,也不必关闭它。:-)