2010-11-20 62 views
7

什麼是在我的程序中使用多個掃描儀對象的正確方法。例如,我使用掃描儀讀取文件,然後根據文件中找到的內容,我再次使用掃描儀提示用戶輸入。我的代碼摘錄如下如何在System.in上使用多個掃描儀對象?

.... 
Scanner f = new Scanner (System.in); //get the file name 
String fileName = f.next(); 
Scanner input = new Scanner(new File(fileName)); 
while (input.hasNext()) 
{ 
    String currentLine = input.nextLine(); 
    if (some pattern found) { 
     Scanner getUserInput = new Scanner (System.in); 
     String userInput = getUserInput.next(); 
     ..... 
    } 
} 
.... 

它似乎並不奏效。我需要使用userInput.close()嗎?我究竟做錯了什麼。 ?

我不明白的是,第一個System.in只是獲取文件名。之後,它爲什麼會干擾第二個System.in。 至於input對象,它從文件讀取而不是從System.in讀取。

回答

11

我在做什麼錯?

在同一個流中使用多個掃描儀是潛在的問題。掃描儀可以(也將會)使用該流 - 這可能(將)導致意想不到的副作用。最好不要這樣做。

如果輸入是關閉的,那麼輸入(但字符串沒有close方法)對每個人都是關閉的 - 對任何人來說都沒什麼好玩的。

編輯:爲什麼多臺掃描儀是壞 「詳細信息」:Do not create multiple buffered wrappers on an InputStream

...任何緩衝包裝是不安全的;這種情況也是可以利用的,如果使用掃描儀代替...

另請參閱Java code question ... scanner related?其中還談到了一些方法。

+0

斷開的鏈接看起來應該是 - > https://www.securecoding.cert.org/confluence/display/java/FIO06-J.+Do+not+create+multiple+buffered+wrappers+on+一個+單+字節+或+字符+流 – iX3 2015-09-20 03:42:58