我应该关闭StringReader吗?

Svi*_*ish 19 java stringreader

我使用a StringReader将字符串转换为可以上传到SFTP服务器的字符串(它需要一个流).StringReader事后关闭是否有任何意义?据我所知,它只是将字符串设置为null......

我可以做到这一点,但是因为close方法被标记为抛出一个IOException而且我必须将它包装在try catch中并且代码最终看起来比它可能需要的更加可怕.

Whi*_*g34 13

如果你知道你正在处理StringReader你将丢弃的东西,我认为没有理由关闭它.在你关闭它之后我无法想象你有任何理由持有它的引用,所以对于null为垃圾收集设置的字符串没有任何实际好处.如果你正在创建一个接受a的方法,Reader那么关闭它可能是有意义的,因为你不知道底层类型.


Ste*_*han 6

它的作用不止于此。如果我可以引用 JavaDoc:

/**
 * Closes the stream and releases any system resources associated with
 * it. Once the stream has been closed, further read(),
 * ready(), mark(), or reset() invocations will throw an IOException.
 * Closing a previously closed stream has no effect.
 */
Run Code Online (Sandbox Code Playgroud)

所以是的,你应该关闭那个阅读器。不是为了资源,而是为了优秀的风格和可能跟随你的程序员。你不知道这个实例将被传递到哪里以及其他人会尝试用它做什么。有一天,您可能还会选择更改接口并接受任何 Reader 实现,在这种情况下,您可能会处理需要调用 close() 以释放资源的 Reader。

因此,在完成此实例后,防止进一步(可能是错误的)使用此实例是一种很好的方式。而且由于它没有伤害,它只会防止将来可能出现的错误。

编辑: 既然你说你的 close() 方法声明了一个可能会抛出的异常,我会说你需要调用 close() 因为 StringReader.close() 不会抛出异常。但是, Reader.close() 确实如此。因此,您已经允许 Reader 的其他实现,因此您必须关闭它,因为您无法知道最终会获得 Reader 的哪些实现。如果我们谈论的是永远不会离开该范围的三行代码,请声明您的变量 StringReader 并无论如何调用 close(在这种情况下没有异常处理)。