2010-11-20 12 views
7

qual è il modo corretto di utilizzare più oggetti Scanner nel mio programma. Ad esempio, io uso lo scanner per leggere un file, quindi a seconda di ciò che si trova nel file, io uso di nuovo lo scanner per richiedere l'input dell'utente. Viene mostrato un estratto del mio codiceCome utilizzare più oggetti dello scanner su 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(); 
     ..... 
    } 
} 
.... 

Non sembra funzionare. Devo usare userInput.close()? Che cosa sto facendo di sbagliato. ?

Quello che non capisco è che il primo System.in sta solo ricevendo il nome del file. Dopo questo, perché interferisce con il secondo System.in. Come per l'oggetto input, la sua lettura da un file e non da System.in.

risposta

11

Cosa sto facendo male?

L'utilizzo di più scanner sullo stesso stream è il problema sottostante. Gli scanner possono (e lo faranno) consumare il flusso - questo può (provocare) effetti collaterali inattesi. Meglio non farlo.

Se l'ingresso è chiuso, l'ingresso (ma le stringhe non hanno il metodo close) è chiuso per tutti - e non è molto divertente per nessuno.

Edit: "Dettagli" sul perché più scanner sono male: Do not create multiple buffered wrappers on an InputStream

... qualsiasi involucro tamponata è a rischio; questa condizione è anche sfruttabile se invece si utilizza uno scanner ...

Vedere anche Java code question ... scanner related? che parla anche di alcuni approcci.

+0

collegamento interrotto sembra come dovrebbe essere -> https://www.securecoding.cert.org/confluence/display/java/FIO06-J.+Do+not+creare+multiple+buffered+wrappers+on+ un + singolo + byte + o + carattere + flusso – iX3

Problemi correlati