Cierre un escáner vinculado a System.in

Tengo un Scanner vinculado a System.in . Ahora, después de usar el Scanner , debería cerrarlo, ya que es una mala práctica de encoding dejarlo abierto. Pero, si cierro el Scanner , ¡también System.in ! ¿Alguien puede decirme cómo puedo cerrar el Scanner sin cerrar System.in (si hay alguna manera).

Una opción es envolver su transmisión System.in en un CloseShieldInputStream que evita que se cierre. Su lector utilizaría el CloseShieldInputStream lugar de la stream Raw System.in .

Aquí está la API para la clase: http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html

Lo más simple es no cerrar el escáner si no desea cerrar el flujo subyacente.

Idealmente, debería crear solo un Scanner que use durante la vida del progtwig. En cualquier caso, parece que no tienes una buena razón para cerrarlo.

En lugar de agregar clases de protección y cosas así, simplemente haga un buen comentario y un

  @SuppressWarnings("resource") 

Eso es lo suficientemente bueno. Y no veo muchos inconvenientes en este enfoque. No olvides el comentario.

Tengo recuerdos vagos de problemas extraños y no diagnosticables hace mucho tiempo con el uso del mismo Scanner of System.in dos veces, así que esto es lo que uso (aunque probablemente solo debas usar un escáner mientras dure el progtwig):

 static String input() { try { return new Scanner(System.in).nextLine(); } catch (NoSuchElementException e) { throw e; } } 

Por alguna razón, esto funciona sin advertencias, mientras que si no hago el tiro de captura, Eclipse se quejará Resource leak: '' is never closed .

De acuerdo con la API para InputSteam “El método de cierre de InputStream no hace nada.”, Por lo que System.in es una instancia de InputStream, no necesita preocuparse por el cierre de close ().