La transmisión de múltiples veces se cierra y se abre en el mismo error de archivo

Estoy tratando de leer la entrada de la consola usando dos clases en el mismo método InputStreamReader y BufferedReader . He cerrado el flujo de la clase anterior y leí la entrada nuevamente pero ahora estoy usando la última clase. Muestra un error si cierro la secuencia de la clase anterior antes de invocar el método read () de la secuencia BufferedReader. Pero al cerrar InputStreamReader secuencia al final del método, está funcionando bien.

Mis pensamientos son: dado que he cerrado la secuencia de la clase utilizada anteriormente, la secuencia posterior es independiente de ella y, por lo tanto, no debería afectar la ejecución del código.

public static void main(String[] args) throws Exception {


    //File file = new File("D:\\IOSUMIT\\new_file.txt");

    InputStreamReader isr= new InputStreamReader(System.in);

    System.out.println("your input " + (char)isr.read());



    isr.close();  //here error occurs


    InputStreamReader isrp= new InputStreamReader(System.in); // Line 1

    BufferedReader br = new BufferedReader(isrp);
    int temp = br.read();

    System.out.println("your input  Buffered" + (char)temp);



    br.close();

ERROR DE SALIDA

4 4

your input 4Exception in thread "main" java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getBufIfOpen(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.read(Unknown Source)
    at IO.Q7.main(Q7.java:60)
Respuesta 1

Comencemos con esto:

isr.close();  //here error occurs

En realidad, eso no es donde ocurre el error. Eso es un arenque rojo. De acuerdo con el stacktrace, la siguiente declaración arroja la excepción:

int temp = br.read();

Lo cual tiene sentido. El isr.close()está cerrando tanto el Reader como la secuencia de entrada que envuelve. Ese flujo de entrada es elSystem.in flujo.

Entonces, cuando creas un segundo InputStreamReadery BufferedReaderestás envolviendo una secuencia que has cerrado previamente.

Por lo tanto, cuando intentas leer de tus nuevos lectores, obtienes una excepción.

Solución: una vez cerrado, la System.insecuencia permanecerá cerrada. Así que no cierres System.in.


Tu preguntaste:

¿No se volvería a abrir la secuencia de entrada en la Línea 1 comentada dentro del constructor BufferReader?

 InputStreamReader isrp= new InputStreamReader(System.in); // Line 1

Respuesta corta: no.

El newestá creando una nueva InputStreamReaderinstancia que envuelve el valor actual de System.in. En este caso, ese valor es una referencia para un FileInputStreamobjeto para el descriptor de archivo 0 ... que cerró anteriormente.

Respuesta: 2

Estoy tratando de ejecutar mi primera prueba a través de Appium y obtengo el siguiente error. org.openqa.selenium.SessionNotCreatedException: no se pudo crear una nueva sesión. (Error original: no se obtuvo la sesión ...

¿Qué significa "equivalente dinámico"? Me pregunto cuál es el propósito de tener this.getClass (). IsInstance (aClass) en lugar de esta instancia de aClass? ¿Hay una diferencia? Determina si el ...

Actualmente estoy planeando una aplicación que funciona en una base de datos relacional de objetos. El trabajo es simple: solo busca datos, analízalos, muéstralos al usuario y escribe algunos cambios. Para apoyar a ...

Estoy experimentando con OKHttp (versión 2.0.0-RC2) y SPDY y veo IOException: la transmisión se restableció: CANCELAR bastante, tal vez el 10% o más de todas las solicitudes en algunas pruebas preliminares. Cuando usas ...