2011-11-20 14 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); 

me he dado cuenta de que si cierro la BufferedReader, no voy a ser capaz de insertar la entrada del teclado más, ya que es de alguna manera System.in cerrado. ¿De todos modos puedo mantener br.close() (lo necesito para eliminar un archivo) y luego agregar más entradas desde el teclado?Cierre BufferedReader y System.in

+2

borrar qué archivo? BufferedReaders están destinados a estar vinculados a un flujo de entrada particular. Una vez que los cierras no puedes reutilizarlos. – soulcheck

+6

Usted * realmente * no debería necesitar cerrar 'br' para eliminar un archivo. –

+1

Si está leyendo desde un archivo y está utilizando 'BufferedReader' hasta cierto punto y luego cierra' BufferedReader' y luego lee más de la secuencia de archivos, perderá algunos bytes. Estos bytes son consumidos por el lector almacenado (para amortiguar). Necesitarás encontrar otra forma. ¿Por qué necesita pasar de una subclase Reader a una Scanner? Algunas restricciones de api? En cualquier caso, puede hacer las cosas de manera diferente, por ejemplo, utilizando un 'RandomAccessFile' y/o una subclase de escáner personalizada que también puede hacer cosas de Reader. –

Respuesta

2

Parece que necesitas:

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

Wrap que alrededor del System.in antes de hacer su lector, y luego todo estará bien, ya que no va a hacer que cuando se está utilizando un FileInputStream.

+0

¿cómo exactamente hago eso? –

+0

Usted dice 'new CloseShieldInputStream (System.in)' – bmargulies

+0

gracias. Terminé usando una forma de evitar esto, no eliminé ese archivo, simplemente lo re-escribí con la información correcta :) –

0

Si solo desea obtener la entrada del teclado por System.in, utilice el BufferedReader estático envolviendo InputStreamReader (también envolviendo System.in). De esta manera:

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

Y is.close(); sería necesario justo antes de que finalizara su solicitud.