ImageIO读取中的控制缓存是什么意思

What does control caching means in ImageIO read

我对使用 BufferedImage 对象的唯一担心是,对于 60000x32000 的非常大的图像,它会导致 JVM 在有限的 JVM 堆上因 OOM 而关闭 space。然而, ImageIO.read 方法的 JavaDocs 说了一些关于 "control caching" 的内容。

在此上下文中什么是控件缓存?

这是否意味着 ImageIO.read 对大图像使用磁盘上的图像缓存?

参考JavaDocs和下面的ImageIO.read方法:

       /**
         * Returns a <code>BufferedImage</code> as the result of decoding
         * a supplied <code>File</code> with an <code>ImageReader</code>
         * chosen automatically from among those currently registered.
         * The <code>File</code> is wrapped in an
         * <code>ImageInputStream</code>.  If no registered
         * <code>ImageReader</code> claims to be able to read the
         * resulting stream, <code>null</code> is returned.
         *
         * <p> The current cache settings from <code>getUseCache</code>and
         * <code>getCacheDirectory</code> will be used to control caching in the
         * <code>ImageInputStream</code> that is created.
         *
         * <p> Note that there is no <code>read</code> method that takes a
         * filename as a <code>String</code>; use this method instead after
         * creating a <code>File</code> from the filename.
         *
         * <p> This method does not attempt to locate
         * <code>ImageReader</code>s that can read directly from a
         * <code>File</code>; that may be accomplished using
         * <code>IIORegistry</code> and <code>ImageReaderSpi</code>.
         *
         * @param input a <code>File</code> to read from.
         *
         * @return a <code>BufferedImage</code> containing the decoded
         * contents of the input, or <code>null</code>.
         *
         * @exception IllegalArgumentException if <code>input</code> is
         * <code>null</code>.
         * @exception IOException if an error occurs during reading.
         */
        public static BufferedImage read(File input) throws IOException {
            if (input == null) {
                throw new IllegalArgumentException("input == null!");
            }
            if (!input.canRead()) {
                throw new IIOException("Can't read input file!");
            }

            ImageInputStream stream = createImageInputStream(input);
            if (stream == null) {
                throw new IIOException("Can't create an ImageInputStream!");
            }
            BufferedImage bi = read(stream);
            if (bi == null) {
                stream.close();
            }
            return bi;
        }

在此上下文中,它仅表示 read 方法将使用 getUseCachegetCacheDirectory 中的设置来控制是否允许缓存 (getUseCache) 和如果是这样,它可以在哪里存储临时文件 (getCacheDirectory)。

ImageIO 中的缓存并不引人注目,可能仅用于处理不可搜索的流。例如,当 ImageIO 需要确定图像的大小时,它可能需要读取流的很大一部分。然后它可能需要再次重新读取流的那部分以进行实际解码。

对于支持搜索的文件和流,这不是问题,因为您可以在开始解码时重新阅读前面的部分。对于 HTTP 流来说,没有这样的选项,在那些情况下,部分流可能需要存储在某个地方以便稍后对其进行解码。这可以在内存中 (MemoryCacheImageInputStream) 或在临时文件中 (FileCacheImageInputStream)。

使用哪种类型的流由 ImageIO class 根据缓存设置和底层媒体动态决定。

因此,我认为这对处理非常大的图像没有帮助。您仍然需要确保 VM 有足够的 space 来解码它们。