Java - Problema con BufferedReader

 
Vista:
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema con BufferedReader

Publicado por jose (73 intervenciones) el 30/12/2018 21:36:28
Buenas noches,

Dentro de 2 semanas tengo un exámen de java y por practicar estoy haciendo pequeños programas. Tengo una duda de la que no consigo salir.

Tengo el siguiente archivo en un txt
1
2
3
4
5
6
7
8
9
10
11
+#########################
Listado de Alumnos
#######################
Id_Alumno;Nombre;Apellidos
###############################
001;jos;rod
002;pepe;ro2
003;hos;ro3
###############################
El número total de alumnos es 3
fin

Dicho archivo se crea desde a través de un módulo que crea el archivo y le añade todos los datos. Cada vez que añadimos un registro el archivo aumenta de líneas.

Desearía ver por pantalla la información de alumnos, nombre y apellidos

001;jos;rod
002;pepe;ro2
003;hos;ro3

y el resto de registros nuevos cada vez que se vaya añadiendo al archivo.

El otro problema que tengo y no consigo ver el error, es que se salta las líneas de dos en dos.
Si
Línea 0 +#########################
Linea 1 Listado de Alumnos
Linea 2 #######################

Se convierte en
Línea 0 +#########################
Linea 1 #######################

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public String ReadFile(String pathSt) {
 
    BufferedReader br = null;
    int sumaLineas=9;
    try {
 
        br = new BufferedReader(new FileReader(pathSt));
        String line ="";
        int i=0;
        System.out.println("Listado de Alumnos");
        while ((line=br.readLine()) != null) {
 
            if (i==3) {
                String[] datos = line.split(";");
                System.out.println(datos[0]+"\t\t"+datos[1]+"\t\t"+datos[2]);
            }
 
            if ((i==5)||(i==sumaLineas)) {
                sumaLineas=i+1;
 
                String[] datos = line.split(";");
                System.out.println(datos[0]+"\t\t"+datos[1]+"\t\t"+datos[2]);
 
            }
            if (br.readLine().contains("fin")) {
                System.out.print("fin de archivo");
 
            }
            i++;
 
        }
 
    }catch (Exception e) {
        System.out.println("Error Leyendo archivo:" + pathSt + e);
    }
    return "";
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema con BufferedReader

Publicado por Kabuto (1381 intervenciones) el 30/12/2018 23:52:10
Dentro del while haces dos lecturas del archivo, por eso te salta de dos en dos:

La primera lectura es esta:
1
while ((line=br.readLine()) != null)

Y esta la segunda, que es la problemática:
1
2
3
if (br.readLine().contains("fin")) {
    System.out.print("fin de archivo")
}

Esta segunda lectura evítala. En lugar de pedir a readLine() que te de otra línea, pregunta por el String line, que contiene la linea leída en la primera lectura:
1
2
3
if (line.contains("fin")) {
    System.out.print("fin de archivo")
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema con BufferedReader

Publicado por jose (73 intervenciones) el 31/12/2018 08:11:17
Muchas gracias kabuto,

Como siempre ayudas y explicas para que entendamos este lenguaje.

Como sigo con el programa que usaré para estudiar ahora tengo un error de Out of Bounds en Array donde guardo los datos del archivo.

También supongo que por eso no me lee hasta que encuentra "fin".

1
2
3
4
5
6
7
Listado de Alumnos
Id_Alumno		Nombre		Apellidos
001		001		001
002		002		002
003		003		003
004		004		004
Error Leyendo archivo:java.lang.ArrayIndexOutOfBoundsException: 1

Este es el código final

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public String ReadFile(String pathSt) {
 
		BufferedReader br = null;
		int sumaLineas=9;
		try {
			FileReader fr = new FileReader(pathSt);
			br = new BufferedReader(fr);
 
			String line ="";
			int i=0;
			System.out.println("Listado de Alumnos");
			while ((line=br.readLine()) != null) {
 
				//System.out.println(line);
				if (i==3) {
					String[] datos = line.split(";");
					System.out.println(datos[0]+"\t\t"+datos[1]+"\t\t"+datos[2]);
				}
 
				if ((i==5)||(i==sumaLineas)) {
					if(line!=null) {
					sumaLineas=i+1;
					}
					String[] datos = line.split(";");
					System.out.println(datos[0]+"\t\t"+datos[1]+"\t\t"+datos[2]);
 
				}
				if (line.contains("fin")) {
				    System.out.print("fin de archivo");
				}
 
				i++;
			}
			br.close();
			fr.close();
		}catch (Exception e) {
			System.out.println("Error Leyendo archivo:" + e);
		}
		return "";
	}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema con BufferedReader

Publicado por Kabuto (1381 intervenciones) el 01/01/2019 00:38:11
Hooolaaa y Feliz Año.

Intuyo que el problema está en este parte del código:
1
2
3
4
5
6
if ((i==5)||(i==sumaLineas)) {
	if(line!=null) {
	sumaLineas=i+1;
}
String[] datos = line.split(";");
System.out.println(datos[0]+"\t\t"+datos[1]+"\t\t"+datos[2]);

No tengo muy claro lo que se pretende conseguir con la variable sumaLineas.
Supongo que de algún modo pretendes controlar hasta que lineas puedes leer registros, pero en cualquier caso no parece que lo estés consiguiendo.
Creo que en algún momento se hace un split(";") a esta línea:
1
###############################

Con lo cual obtienes un array "vacío" y eso te lleva a la excepción: java.lang.ArrayIndexOutOfBoundsException

Porque al intentar hacer esto con el array vacío...:
1
System.out.println(datos[0]+"\t\t"+datos[1]+"\t\t"+datos[2]);

Estás pidiendo valores a datos[0], datos[1],....pero como el array está vacío, no hay valores que obtener, y eso provoca la excepción anterior.

Repito que es solo una suposición, quizás me equivoco, pero creo que los tiros van por ahí.

Hay que buscar otra forma para saber qué líneas son registros de los que podemos hacer split(";") y cuáles no.
Y la solución es mucho más sencilla de lo que parece. Basta con preguntar si la línea que hemos leído contiene o no el caracter ";" y para ello podemos usar el metodo contains(), tal y como ya has hecho para intentar encontrar la linea "fin".
Y de hecho, si lo hacemos así, ya no necesitamos controlar si estamos leyendo la línea 4 (cuando i == 3) que corresponde a la cabecera de los datos. Antes sí, porque hacías lo del sumaLineas...

Pero como ahora no es necesario, y el split() y el system.out es el mismo para la cabecera como para los registros de datos.., pues todo se simplifica más...
Salvo que quieras contar líneas por algún otro motivo, ya no vas a necesitar la variable i tampoco

1
2
3
4
5
6
7
8
9
10
11
12
while ((line=br.readLine()) != null) {
 
    if (line.contains(";")) { //Es una linea a la que podemos hacer split()
        String[] datos = line.split(";");
        System.out.println(datos[0]+"\t\t"+datos[1]+"\t\t"+datos[2]);
    }
 
    if (line.contains("fin")) {
        System.out.print("fin de archivo");
    }
 
}

Compruébalo, a ver si así se solucionan los problemas.

¡¡Ah!! Otra cosa.

Tu método lo has declarado como que devuelve un tipo String.
1
public String ReadFile(String pathSt)

Y esto te obliga a hacer un return de una cadena cualquiera, a pesar de que en realidad parece que no necesitas retornar nada:
1
return "";

Si no necesitas que este método retorne nada, decláralo como tipo void (vacío) y no tendrás que hacer ningún return.
1
public void ReadFile(String pathSt)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema con BufferedReader

Publicado por jose (73 intervenciones) el 01/01/2019 09:00:35
Hola Kabuto,

Muchas gracias por la ayuda. Se agradece el esfuerzo de explicarlo con claridad y ejemplos.

Feliz año!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar