我使用StringReader将字符串转换为可以上传到SFTP服务器的内容(它接受一个流)。之后关闭那个StringReader有什么意义吗?据我所知,在源代码中它只是将字符串设置为null...
我可以直接这样做,但是由于close方法被标记为抛出一个IOException,所以我只需要将它包装在一个try catch中,结果代码看起来比它可能需要的要可怕得多。
发布于 2011-05-25 17:14:12
如果你知道你正在处理一个将要丢弃的StringReader,我看不出有任何理由关闭它。我想不出有什么理由会在关闭它之后保留对它的引用,所以将字符串设置为null进行垃圾回收并没有什么实际的好处。如果您正在创建一个接受Reader的方法,那么关闭它可能是有意义的,因为您不知道底层类型。
发布于 2011-05-25 17:21:15
它做的还不止这些。如果我可以引用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.
*/所以,是的,你应该关闭那个阅读器。不是为了资源,而是为了良好的风格和可能会跟随你的程序员。您不知道这个实例将被传递到哪里,也不知道其他人会试图对它做什么。有一天,您可能还会选择更改接口并接受任何Reader实现,在这种情况下,您可能需要处理一个需要调用close()来释放资源的Reader。
因此,在使用完此实例后,防止其进一步(可能是错误的)使用是一种很好的方式。既然它不会造成伤害,它只会防止未来可能出现的错误。
close编辑:既然你说你的()方法声明了一个它可能抛出的异常,我想说你需要调用close(),因为StringReader.close()不会抛出异常。但是,Reader.close()需要。所以你已经允许了Reader的其他实现,所以你必须关闭它,因为你不知道你最终会得到Reader的什么实现。如果我们讨论的是三行永远不会离开该作用域的代码,那么无论如何都要声明变量StringReader并调用close (在这种情况下没有异常处理)。
发布于 2011-05-25 17:24:36
虽然严格来说不是必须的,因为StringReader只持有一个字符串,作为一个好的形式,无论如何关闭所有的阅读器总是一个好主意。现在你的代码可能正在使用StringReader,但是如果你把它改成了另一个确实需要关闭的阅读器,你的代码没有关闭就是错误的,而你的关闭就可以了。
https://stackoverflow.com/questions/6122013
复制相似问题