如果我有一个带读者的方法,我想在读卡器上使用扫描仪操作:
Scanner scanner = new Scanner(reader);
while(scanner.hasNext()) {
//blah blah blah
}
关闭scanner
是否安全?文档说它“关闭了这个扫描程序”,然后谈论关闭底层可读。假设我不想关闭可读性,而是希望调用者在准备好时关闭reader
。在这里关闭scanner
是否安全?
答案 0 :(得分:23)
这取决于你想要安全的东西。
如果您只是想确保关闭基础流,那么任何一种方法都可以。
如果您还希望Scanner
被标记为已关闭(以便对象上的所有后续操作都会立即失败),那么您应该调用Scanner.close()
。
这是一般原则;即,它也适用于以某种方式进行内存缓冲的各种流。
答案 1 :(得分:9)
由于我已经打开了源代码:-) ...
close()
方法检查基础Readable
是否也实现Closeable
接口,如果是,则关闭它。在你的情况下,你说这不是一个问题,因为它将在稍后关闭。
但是close()
方法还设置了一些内部标志,表明Scanner
(以及基础Readable
)已关闭。许多公共方法首先检查Scanner
是否已关闭。因此,这里的危险可能是您的基础Readable
可能已关闭,但是对Scanner
的进一步调用不会立即抛出IllegalStateException
,而是以其他方式失败,因为它们继续进行。
如果你可以确保没有任何其他方法可以处理有问题的Scanner
实例,并且不会尝试在其上调用任何其他方法,那么你可能没问题。
close()
方法也会将其对Readable
的引用归零,所以如果不发生这种情况,Scanner
就不会在收到垃圾后立即收集垃圾叫close()
。
如果可能,我会致电Scanner.close()
。
答案 2 :(得分:1)
我也需要关闭Scanner
,并保持底层流的开放以便进一步开展工作。我所做的是创建一个扩展BufferedInputStream
的类,并用空体覆盖close()
方法。这节课我加入了Scanner
的构造函数。这样,您可以在不关闭流的情况下调用scanner.close()
。您需要保留对原始BufferedInputStream
的引用,但这很明显。
答案 3 :(得分:0)
好吧,如果你有Caller和Reader类。来电者不应该知道Reader的实现。在读者的下一个方法中:
while scanner has object
read them ( one object per method's call)
when objects are done
close the reader.
这是一种迭代器模式。