Tengo problemas para usar FileReader para escribir un archivo txt en una matriz (Java), ¿qué estoy haciendo mal?

StackOverflow https://stackoverflow.com/questions/2613481

Pregunta

Scanner s = null;
    try {
        s = new Scanner(new BufferedReader(new FileReader("rates.txt")));
            for (int i=0; i<9; i++){
                while(s.hasNext()){rates[i] = s.next();}
                System.out.println(rates[i]);
            }
    }catch (IOException e){
        System.out.println(e);
    }
    finally {
        if (s != null) {
            s.close();
        }
    }

Cuando ejecuto este código, lee el último fragmento de caracteres de mi archivo de texto, los coloca en tasas [0] y deja un valor nulo en 1-9.No estoy seguro de por qué lee primero el final de mi archivo.El contenido del txt se encuentra a continuación.

USD 1.34

EUR 1.00

JPY 126.28

GBP 0.88

INR 60.20

Lee 60.20, que es todo lo que registra en la matriz.Cualquier ayuda sería apreciada.Supongo que podría darte los resultados de ejecutar este código:

run:
60.20
null
null
null
null
null
null
null
null
BUILD SUCCESSFUL (total time: 0 seconds)
¿Fue útil?

Solución

while(s.hasNext()){rates[i] = s.next();}

En la llanura Inglés, esto dice:. Si bien hay fichas a la izquierda, puso el siguiente token en rates[i]

Así que pondrá la primera ficha en rates[i], entonces el siguiente token en rates[i], entonces el siguiente token en rates[i], ..., y, finalmente, la última ficha en rates[i]. Desde i no se modifica, todos los valores se escriben en el mismo elemento de la matriz, sobrescribiendo los valores leídos previamente.

Otros consejos

Recomiendo:

  • Usando List en lugar de matriz
    • Más flexible, mucho más fácil de trabajar, aprovecha Java Collections Framework, etc.
  • No almacenar el símbolo de moneda y el tipo de cambio numérico, todo en una misma bolsa
    • ...pero usando una clase para encapsular el par
  • Usando Scanner.nextDouble() para leer el tipo de cambio numérico (que presumiblemente querrás convertir a double de todos modos)

Entonces, algo como esto:

List<ExchangeRate> allRates = new ArrayList<ExchangeRate>();
while (sc.hasNext()) {
    String symbol = sc.next();
    double rate = sc.nextDouble();
    allRates.add(new ExchangeRate(symbol, rate));
}

Tenga en cuenta cómo:

  • Ya no necesitas saber cuántos elementos asignar en una matriz
  • El símbolo y la tasa no están todos juntos en una misma bolsa
  • List.add significa que no es necesario realizar un seguimiento y administrar un contador
    • es decir.¡El error en tu pregunta original!

Creo que el problema es que la línea 5, que contiene el bucle while, lee todo el archivo de entrada. Así que lo lea todo su archivo en la primera iteración del bucle for donde i = 0; La próxima vez que su bucle for no hay nada que leer.

Es posible que desee algo como esto en su lugar:

List rates = new ArrayList();
while (s.hasNext()) {
      rates.add(s.next());
}

Otro problema potencial: FileReader utiliza la codificación predeterminada plataforma. Esto puede ser apropiado a los archivos suministrados por el usuario del proceso, pero si los archivos son parte de la aplicación, que pueden corromperse cuando la aplicación se ejecuta en un sistema con una codificación predeterminada incompatibles (y no, usando sólo caracteres ASCII hace no que protegen completamente de esta).

Para evitar el problema, utilice la nueva InputStreamReader(new FileInputStream(filename), encoding) lugar - y darse cuenta de que en realidad se tiene que escoger un encoding para su archivo

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