read example java bufferedreader infinite-loop inputstreamreader

example - java read file line by line



Leer todas las lĂ­neas con BufferedReader (7)

Cuando solo presiona Ingresar el retorno de buffer.readLine(); no es nulo es una cadena vacía.

Por lo tanto, debe cambiar la line != null !line.equals("") a !line.equals("") (También puede cambiarla a line.length() > 0 )

Ahora su código se verá algo como esto:

InputStreamReader instream = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(instream); line = buffer.readLine(); while (!line.equals("")){ length = length + line.length(); line = buffer.readLine(); }

Esto debería solucionar tu problema. Espero que esto haya ayudado! :)

Quiero escribir un texto de varias líneas en la consola usando un BufferedReader y cuando presiono "Enter" para encontrar la suma de la longitud del texto completo. El problema es que parece que me estoy metiendo en un bucle infinito y cuando presiono "Enter" el programa no llega a su fin. Mi código está abajo:

InputStreamReader instream = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(instream); line= buffer.readLine(); while (line!=null){ length = length + line.length(); line= buffer.readLine(); }

¿Podría por favor decirme qué estoy haciendo mal?


Desde Java 8, puede usar BufferedReader#lines método BufferedReader#lines directamente en el lector con buffer.

try (InputStreamReader in = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(in)) { final int length = buffer.lines().mapToInt(String::length).sum(); System.out.println("Read length: " + length); } catch (Exception e) { e.printStackTrace(); }


La forma idiomática de leer todas las líneas es while ((line = buffer.readLine()) != null) . Además, sugeriría una declaración de try-with-resources . Algo como

try (InputStreamReader instream = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(instream)) { long length = 0; String line; while ((line = buffer.readLine()) != null) { length += line.length(); } System.out.println("Read length: " + length); } catch (Exception e) { e.printStackTrace(); }

Si desea finalizar el bucle cuando recibe una línea vacía, agregue una prueba para eso en el bucle while

while ((line = buffer.readLine()) != null) { if (line.isEmpty()) { break; } length += line.length(); }

JLS-14.15. La declaración de break dice

Una declaración de break transfiere el control fuera de una declaración adjunta.


Poner todas las líneas en la cadena String []. y segundo método obtener el número de líneas que contiene el archivo de texto. Espero que esto pueda ser de utilidad para cualquiera ..

public static void main(String... args) throws IOException { String[] data = getLines(); for(String v : data) { out.println(v); } } public static String[] getLines() throws IOException { BufferedReader bufferReader = new BufferedReader(new FileReader("C://testing.txt")); String line = bufferReader.readLine(); String[] data = new String[getLinesLength()]; int i = 0; while(line != null) { data[i] = line; line = bufferReader.readLine(); i++; } bufferReader.close(); return data; } public static int getLinesLength() throws IOException { BufferedReader bufferReader = new BufferedReader(new FileReader("C://testing.txt")); String line = bufferReader.readLine(); int size = 0; while(line != null) { size += 1; line = bufferReader.readLine(); } bufferReader.close(); return size; }


Respuesta de Snarky: lo que estás haciendo mal es solo crear 2 objetos en Java para hacer algo ... si buscas, probablemente puedas encontrar algunas clases más que extiendan BufferedReader o ExtendedBufferReader, etc., y luego puede ser real Enterprise Java .

Ahora que he sacado eso de mi sistema: respuesta más útil. System.in se cierra cuando ingresas EOF, que es Control-D en Linux y creo que MacOS, y creo que Control-Z más ingresa bajo Windows. Si desea verificar el ingreso (o más específicamente, dos ingresa ... uno para terminar la última línea y otro para indicar que ha terminado, que es esencialmente la forma en que http se encarga de determinar cuándo han finalizado los encabezados http y es hora de El cuerpo http, entonces la solución de @dbank debería ser una opción viable con una solución menor que voy a intentar hacer para mover el predicado interior en lugar de! while.

(Edición # 2: readLine realizado elimina la nueva línea, por lo que una línea vacía "" en lugar de la nueva línea, por lo que ahora mi código pasa a otra respuesta con el bit EOF como respuesta en lugar de comentario)

Editar ... eso es raro, @dbank había contestado mientras escribía mi respuesta, y me hubiera detenido si no hubiera mencionado la alternativa de EOF. Para repetir su código de memoria con la edición que iba a hacer:

InputStreamReader instream = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(instream); line= buffer.readLine(); while (line != null && !line.equals("")){ length = length + line.length(); line= buffer.readLine(); }


Una línea de código usando Java 8:

line = buffer.lines().collect(Collectors.joining());


line no será nula cuando presionas enter; Será una cadena vacía .

Tome nota de lo que dice el BufferedReader readLine() sobre readLine() :

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.

Y readLine() devuelve:

Una cadena que contiene el contenido de la línea, sin incluir los caracteres de terminación de línea, o nula si se ha llegado al final de la secuencia

Por lo tanto, cuando presiona [Enter], le está dando a BufferedReader una nueva línea que contiene solo /n , /r , o /r/n . Esto significa que readLine() devolverá una cadena vacía.

Así que intenta algo como esto en su lugar:

InputStreamReader instream = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(instream); line = buffer.readLine(); while( (line != null) && (!line.isEmpty()) ){ length = length + line.length(); line = buffer.readLine(); }