我使用ImageIntputStream从Internet Connection读取BufferedImage。我关闭ImageIntputStream在try头中创建它。
try(ImageIntputStream is = new ImageIntputStream(connection)) {
BufferedImage img = ImageIO.read(is);
} catch(IOException readException) {
readException.printStackTrace();
}
我想,安全就足够了。但是,阅读关于与读者/作者合作的帖子,例如here或here或here,我看,我应该冲洗一些东西,处理某些东西,关闭某些东西,然后将null放入什么东西,这些东西有时是不同的,如果我分开使用阅读器。看到这种坚持摧毁读者和流或任何与他们相关的东西,我感到惭愧的是我的弱小和原始的安全措施。
如果我不使用这个ImageReader,在获得我的图像后,我还有什么能够以其他方式冲洗,丢弃,关闭,关闭,射击,杀死,摧毁,降级,沉默,伤害或冒犯?
答案 0 :(得分:1)
您不需要刷新任何读取器或包装输入流的任何内容。刷新用于输出。
然而,关闭阅读器是安全的,并且(IMO)清洁。并且它确实防止了假设的可能性,即一些可释放的资源被保留在读者级别;例如如果您或其他人有理由更改您的应用程序以使用其他读者类。
例如,FileCacheImageInputStream
会将输入流缓存在临时文件中。仅在FileCacheImageInputStream
关闭时才会删除缓存文件。所以在那个的情况下,只关闭基本流可能会泄漏文件和/或文件描述符。
答案 1 :(得分:1)
我为自己的弱小和原始的安全措施感到羞耻。
TLDR;
不要。你很好。
长版:
您正在使用try-with-resources statement,它会在"隐式"中自动调用资源上的close()
。 finally
完成后try
。 ImageInputStream
是您创建的唯一资源,因此它是您负责处理的唯一资源。
ImageIO.read
方法将处理内部管理,例如处理ImageReader
实例等本身。这不是您的责任(您甚至无法访问这些对象,因此即使您真的想要也不会这样做。)
要释放已返回BufferedImage
的内存,只需分配null
引用或让它超出范围。垃圾收集器将为您清理,就像任何普通的Java对象一样。您可能也会调用flush()
来释放与图像关联的本机/显示内存(如果有)。它并没有伤害。如果你没有,那么无论如何都会释放记忆,所以不用担心。
更长的版本:
您在问题中提到的帖子与您的代码大多无关。其中两个是关于写图像,直接使用ImageWriter
。在这种情况下,您应该在使用后始终close()
ImageOutputStream
和dispose()
ImageWriter
实例。
您引用的帖子的最后一个(好的,中间一个)是使用BufferedImage
上下文将绘图发送到Graphics
。在这种情况下,您应该在使用后始终dispose()
Graphics/Graphics2D
。
也可以直接使用ImageReader
读取图像(类似于编写示例)。在这种情况下,您应始终close()
ImageInputStream
和dispose()
ImageReader
实例。
然而,这些是与您在问题中的代码示例中所做的不同的用例。我只是为了完整性而添加它。
最后,提出一条建议:不要因为阅读Google随机结果而感到困惑。如有疑问,请转到来源。从字面上看,通过阅读Java库源代码,或阅读API文档。 ; - )
进一步阅读: