2011-11-20 15 views
5
Reader rdr = new InputStreamReader(System.in); 
BufferedReader br = new BufferedReader(rdr); 
String s; 
s = br.readLine(); 
br.close(); 
Scanner sc = new Scanner(System.in); 
s = sc.nextLine(); 
System.out.print(s); 

ho notato che se chiudo il BufferedReader, non sarò in grado di inserire input da tastiera più, come System.in è in qualche modo chiuso. C'è comunque che posso mantenere br.close() (ne ho bisogno per cancellare un file) e quindi aggiungere più input dalla tastiera?Chiusura BufferedReader e System.in

+2

eliminare quale file? BufferedReaders è pensato per essere associato a un particolare flusso di input. Una volta che li hai chiusi non puoi riutilizzarli. – soulcheck

+6

In realtà * veramente * non dovrebbe essere necessario chiudere 'br' per eliminare un file. –

+1

Se si sta leggendo da un file e si utilizza un 'BufferedReader' fino ad un certo punto e poi si chiude' BufferedReader' e poi si legge di più dal flusso di file, si perderanno alcuni byte. Questi byte sono consumati dal lettore bufferizzato (per buffer). Dovrai trovare un altro modo. Perché è necessario passare da una sottoclasse di Reader a uno scanner? Alcune restrizioni API? In entrambi i casi, puoi fare le cose in modo diverso, ad esempio utilizzando un 'RandomAccessFile' e/o una sottoclasse di Scanner personalizzata che può fare anche cose Reader. –

risposta

2

Sembra che vi serve:

http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html

Wrap che circa System.in prima di fare il vostro lettore, e poi tutto andrà bene, dal momento che non farlo quando si utilizza un FileInputStream.

+0

esattamente come faccio? –

+0

Hai detto "nuovo CloseShieldInputStream (System.in)" – bmargulies

+0

grazie. Ho finito per usare un modo per aggirare questo, non ho cancellato quel file, l'ho appena riscritto con le informazioni corrette :) –

0

Se si desidera ottenere input dalla tastiera tramite System.in, utilizzare BufferedReader statico che include InputStreamReader (che include anche System.in). Ti piace questa:

Public BufferedReader is = new BufferedReader(new InputStreamReader(System.in)); 

E is.close(); sarebbe necessario giusto prima che l'applicazione venga chiusa.