No obtengo el resultado que espero usando readLine () en Java
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?
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.