如果关闭底层可读文件,关闭Java扫描程序是否安全?

时间:2011-05-07 04:34:33

标签: java java.util.scanner

如果我有一个带读者的方法,我想在读卡器上使用扫描仪操作:

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

关闭scanner是否安全?文档说它“关闭了这个扫描程序”,然后谈论关闭底层可读。假设我不想关闭可读性,而是希望调用者在准备好时关闭reader。在这里关闭scanner是否安全?

4 个答案:

答案 0 :(得分:23)

这取决于你想要安全的东西。

  • 如果您只是想确保关闭基础流,那么任何一种方法都可以。

  • 如果您还希望Scanner被标记为已关闭(以便对象上的所有后续操作都会立即失败),那么您应该调用Scanner.close()

    < / LI>

这是一般原则;即,它也适用于以某种方式进行内存缓冲的各种流。

答案 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. 

这是一种迭代器模式。