Java - Problema con flujo de ficheros

 
Vista:
sin imagen de perfil
Val: 6
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con flujo de ficheros

Publicado por Jonathan (3 intervenciones) el 18/05/2017 17:48:06
El problema que tengo es el siguiente:
Tengo un ejercicio que me pide que lea los numeros reales de un archivo txt separados por comas o espacios, hasta aqui todo facil, la cuestion es el porque el ultimo valor no se me esta almacenando?.

Fichero reales.txt
1
2
34.5,45.7,23.6 8.4, 9.6
12.0 23.3

Clase principal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void main(String[] args) throws IOException {
 
		FileInputStream fi = new FileInputStream("reales.txt");
		ArrayList<Double> list = new ArrayList<Double>();
 
		int length = fi.available();
		String aux = "";
 
		for(int i=0;i<length;i++){
			char c = (char)fi.read();
			if(c!=','&&c!=' '&&c!='\n'){
				aux+=c;
			}else{
				if(aux!=""){
					list.add(Double.parseDouble(aux));
				}
				aux = "";
			}
		}
		fi.close();
		for(Double d:list){
			System.out.println(d);
		}
	}

Resultado que obtengo:
1
2
3
4
5
6
34.5
45.7
23.6
8.4
9.6
12.0

Cualquier ayuda es bien recibida. Gracias
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
sin imagen de perfil
Val: 190
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con flujo de ficheros

Publicado por preguntas (70 intervenciones) el 18/05/2017 19:00:30
Te propongo otra solucion (Un poco mas rapida):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FileInputStream fi = new FileInputStream("reales.txt");
        ArrayList<Double> list = new ArrayList<Double>();
        Scanner s = new Scanner(fi);
        while (s.hasNext()) {
            String[] lines = s.nextLine().replaceAll(",", " ").split(" ");
            for (String line : lines) {
                if (!line.equalsIgnoreCase("")) {
                    list.add(Double.parseDouble(line));
                }
            }
        }
        for (double d : list) {
            System.out.println(d);
        }


Revisa y me comentas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 6
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con flujo de ficheros

Publicado por Jonathan (3 intervenciones) el 18/05/2017 19:49:54
Hola, muchas gracias por responder.

He revisado el codigo que me has mandado y funciona de maravilla , la verdad es que tiene mas sentido de la forma en la que tu lo has hecho, pero como curiosidad podrias decirme si la forma en la que lo hice yo estaba mal planteada? o en que me equivoque para que el resultado no me muestre el ultimo valor.

Muchas Gracias
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

Problema con flujo de ficheros

Publicado por Tom (1831 intervenciones) el 18/05/2017 20:10:06
No te muestra el último valor porque no hay ningún separador ni newline después de él.
Tendrías que poner un if adicional al finalizar el bucle:

1
2
3
4
5
if(aux!=""){
 
	list.add(Double.parseDouble(aux));
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 6
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con flujo de ficheros

Publicado por Jonathan (3 intervenciones) el 18/05/2017 20:38:23
Ahora todo me queda mas claro, Muchisimas gracias.
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

Problema con flujo de ficheros

Publicado por Tom (1831 intervenciones) el 18/05/2017 20:03:29
Ya puestos ... :)

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String args[]) throws FileNotFoundException {
		Scanner sc = new Scanner(new FileInputStream("/tmp/reales.txt")).useDelimiter("[, \n]+");
		ArrayList<Double> list = new ArrayList();
 
		while(sc.hasNextDouble()) {
			list.add(sc.nextDouble());
		}
		sc.close();
		for(Double d : list) {
			System.out.println(d);
		}
	}

run:
34.5
45.7
23.6
8.4
9.6
12.0
23.3
BUILD SUCCESSFUL (total time: 0 seconds)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar