2011-05-07 60 views
31

如果我有需要的读者的方法,我想,象这样一个扫描仪对读者进行操作:只要关闭底层可读性,不关闭Java扫描器是否安全?

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

是否安全,不要关闭scanner?文档说它“关闭这台扫描仪”,然后谈论关闭底层可读。假设我不想关闭可读性,而是希望主叫方在准备就绪时关闭reader。在这里关闭scanner安全吗?

回答

21

这取决于你想要的安全性。

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

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

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

+0

此答案与[文档](http://download.oracle.com/javase/6/docs/api/java/util/Scanner.html#close%28%29)中定义的合同相匹配。 – McDowell 2011-05-07 08:41:43

9

既然我已经有了源代码开放:-) ......

close()方法检查是否底层Readable也实现了Closeable接口,并且如果这样做,关闭它。在你的情况下,你说这不是一个问题,因为它会在晚些时候关闭。

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

如果您可以确保没有其他东西可以处理相关实例的Scanner实例,并且不会尝试调用其上的任何其他方法,那么您可能会确定。

close()方法还空值了其参考Readable,因此,如果不这样做的Scanner不至于太垃圾尽快收集,因为这将有你叫close()

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

0

那么,如果你有Caller和Reader类。来电者不应该知道读者的实施。在读者的下一个方法中:

while scanner has object 
    read them (one object per method's call) 
when objects are done 
    close the reader. 

这是一种迭代器模式。

1

我还需要关闭Scanner,并将底层流保持打开状态以便进一步工作。我所做的是创建一个类,该类扩展了BufferedInputStream,并用空的主体覆盖了close()方法。我将这个类加入到Scanner的构造函数中。这样,您可以在不关闭流的情况下致电scanner.close()。尽管如此,您仍然需要保留对原始BufferedInputStream的引用,但这很明显。