2011-05-07 59 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的引用,但這很明顯。