Pregunta

Estoy usando el fragmento de código a continuación, sin embargo, no está funcionando como lo entiendo.

public static void main(String[] args) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line;
    try {
        line = br.readLine();
        while(line != null) {
            System.out.println(line);
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Al leer el Javadoc sobre readLine () , dice:

Lee una línea de texto. Una línea se considera terminada por cualquiera de un salto de línea ( \ n ), un retorno de carro ( \ r ), o un retorno de carro seguido inmediatamente por un salto de línea .

Devoluciones : Un String que contiene el contenido de la línea, sin incluir ningún carácter de terminación de línea, o nulo si se ha llegado al final de la secuencia

Tiros : IOException : si se produce un error de E / S

Desde mi entendimiento de esto, readLine debería devolver nulo la primera vez que no se ingrese ninguna entrada, excepto una terminación de línea, como \ r . Sin embargo, este código simplemente termina en bucle infinitamente. Después de la depuración, he encontrado que en lugar de que se devuelva un valor nulo cuando solo se ingresa un carácter de terminación, en realidad devuelve una cadena vacía (" " "). Esto no tiene sentido para mí. ¿Qué no estoy entendiendo correctamente?

¿Fue útil?

Solución

  

Desde mi entendimiento de esto, readLine debería devolver null la primera vez que no se ingrese ninguna entrada, excepto una terminación de línea, como '\ r'.

Eso no es correcto. readLine devolverá null si se alcanza el final de la secuencia. Es decir, por ejemplo, si está leyendo un archivo y el archivo finaliza, o si está leyendo desde un socket y el socket se cierra.

Pero si simplemente está leyendo la entrada de la consola, presionar la tecla de retorno en su teclado no constituye un final de transmisión. Es simplemente un carácter que se devuelve ( \ n o \ r \ n según su sistema operativo).

Entonces, si desea dividir tanto la cadena vacía como el final de la línea, debe hacer:

while (line != null && !line.equals(""))

Además, su programa actual debería funcionar como se esperaba si canaliza algún archivo directamente en él, así:

java -cp . Echo < test.txt

Otros consejos

Ninguna entrada no es lo mismo que el final de la secuencia. Por lo general, puede simular el final de la secuencia en una consola presionando Ctrl + D (AFAIK algunos sistemas usan Ctrl + Z en su lugar). Pero supongo que esto no es lo que quieres, así que prueba mejor las cadenas vacías además de las cadenas nulas.

Hay una bonita apache commons lang que tiene una buena api para acciones comunes :). Podría usar StringUtils de importación estática y usar su método isNotEmpty (String) para obtener:

while(isNotEmpty(line)) {
    System.out.println(line);
    line = br.readLine();
}

Puede ser útil algún día :) También hay otras clases útiles en esta biblioteca.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top