不关闭 Java 扫描程序是否安全,前提是我关闭底层可读的?

2022-09-01 09:01:26

如果我有一个需要阅读器的方法,并且我想用扫描仪对阅读器进行操作,如下所示:

Scanner scanner = new Scanner(reader);
while(scanner.hasNext()) {
    //blah blah blah
}

不关闭是否安全?文档说它“关闭此扫描仪”,然后讨论关闭底层可读。假设我不想关闭可读的,而是希望调用方在准备就绪时关闭。不在这里关闭安全吗?scannerreaderscanner


答案 1

这取决于你想要安全防范什么。

  • 如果您只是尝试确保关闭基础流,则任一方法都可以。

  • 如果还希望 将 标记为已关闭(以便对对象的所有后续操作将立即失败),则应调用 。ScannerScanner.close()

这是一项一般原则。即,它也适用于以这种或那种方式执行内存缓冲的各种流。


答案 2

由于我已经打开了源代码:-)...

该方法检查底层是否也实现了接口,如果实现了接口,则关闭接口。在你的情况下,你说这不是一个问题,因为它稍后会关闭。close()ReadableCloseable

但是该方法还设置了一些内部标志,指示(和底层)是闭合的。许多公共方法首先检查以查看是否已关闭。因此,这里的危险是,也许您的底层已经关闭,但是进一步调用不要立即抛出一个,而是在继续时以其他方式失败。close()ScannerReadableScannerReadableScannerIllegalStateException

如果您可以确保没有其他任何内容具有相关实例的句柄,并且不会尝试在其上调用任何其他方法,那么您可能没问题。Scanner

该方法还会将其对 的引用清空,因此,如果不发生这种情况,则不会在调用 时立即收集垃圾。close()ReadableScannerclose()

如果可能的话,我会打电话。Scanner.close()


推荐