如果我不直接使用读者,那么关闭ImageInputStream是否足够?

时间:2017-11-26 22:31:05

标签: java resources try-catch javax.imageio

我使用ImageIntputStream从Internet Connection读取BufferedImage。我关闭ImageIntputStream在try头中创建它。

try(ImageIntputStream is = new ImageIntputStream(connection)) {
    BufferedImage img = ImageIO.read(is);
} catch(IOException readException) {
    readException.printStackTrace();
}  

我想,安全就足够了。但是,阅读关于与读者/作者合作的帖子,例如hereherehere,我看,我应该冲洗一些东西,处理某些东西,关闭某些东西,然后将null放入什么东西,这些东西有时是不同的,如果我分开使用阅读器。看到这种坚持摧毁读者和流或任何与他们相关的东西,我感到惭愧的是我的弱小和原始的安全措施。

如果我不使用这个ImageReader,在获得我的图像后,我还有什么能够以其他方式冲洗,丢弃,关闭,关闭,射击,杀死,摧毁,降级,沉默,伤害或冒犯?

2 个答案:

答案 0 :(得分:1)

您不需要刷新任何读取器或包装输入流的任何内容。刷新用于输出。

然而,关闭阅读器是安全的,并且(IMO)清洁。并且它确实防止了假设的可能性,即一些可释放的资源被保留在读者级别;例如如果您或其他人有理由更改您的应用程序以使用其他读者类。

例如,FileCacheImageInputStream会将输入流缓存在临时文件中。仅在FileCacheImageInputStream关闭时才会删除缓存文件。所以在那个的情况下,只关闭基本流可能会泄漏文件和/或文件描述符。

答案 1 :(得分:1)

  

我为自己的弱小和原始的安全措施感到羞耻。

TLDR;

不要。你很好。

长版:

您正在使用try-with-resources statement,它会在"隐式"中自动调用资源上的close()finally完成后tryImageInputStream创建的唯一资源,因此它是您负责处理的唯一资源。

ImageIO.read方法将处理内部管理,例如处理ImageReader实例等本身。这不是您的责任(您甚至无法访问这些对象,因此即使您真的想要也不会这样做。)

要释放已返回BufferedImage的内存,只需分配null引用或让它超出范围。垃圾收集器将为您清理,就像任何普通的Java对象一样。您可能也会调用flush()来释放与图像关联的本机/显示内存(如果有)。它并没有伤害。如果你没有,那么无论如何都会释放记忆,所以不用担心。

更长的版本:

您在问题中提到的帖子与您的代码大多无关。其中两个是关于图像,直接使用ImageWriter。在这种情况下,您应该在使用后始终close() ImageOutputStreamdispose() ImageWriter实例。

您引用的帖子的最后一个(好的,中间一个)是使用BufferedImage上下文将绘图发送到Graphics。在这种情况下,您应该在使用后始终dispose() Graphics/Graphics2D

也可以直接使用ImageReader读取图像(类似于编写示例)。在这种情况下,您应始终close() ImageInputStreamdispose() ImageReader实例。

然而,这些是与您在问题中的代码示例中所做的不同的用例。我只是为了完整性而添加它。

最后,提出一条建议:不要因为阅读Google随机结果而感到困惑。如有疑问,请转到来源。从字面上看,通过阅读Java库源代码,或阅读API文档。 ; - )

进一步阅读: