У меня проблемы с использованием FileReader для записи TXT-файла в массив (Java), что я делаю не так? - PullRequest
1 голос
/ 10 апреля 2010
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();
        }
    }

Когда я запускаю этот код, он читает последний кусок символов в моем текстовом файле, помещает их в значения [0], вставляет ноль в 1-9. Я не уверен, почему он сначала читает конец моего файла. Содержание текста ниже ..

USD 1.34

EUR 1.00

JPY 126.28

GBP 0.88

INR 60.20

Он читает 60.20, это все, что он записывает в массив. Любая помощь будет оценена. Я думаю, я мог бы дать вам результаты выполнения этого кода:

run:
60.20
null
null
null
null
null
null
null
null
BUILD SUCCESSFUL (total time: 0 seconds)

Ответы [ 4 ]

3 голосов
/ 10 апреля 2010
while(s.hasNext()){rates[i] = s.next();}

На простом английском языке это говорит: пока остаются токены, поместите следующий токен в rates[i].

Таким образом, он поместит первый токен в rates[i], затем следующий токен в rates[i], затем следующий токен в rates[i], ... и, наконец, последний токен в rates[i]. Поскольку i не изменяется, все значения записываются в один и тот же элемент массива, перезаписывая ранее прочитанные значения.

1 голос
/ 10 апреля 2010

Рекомендую:

  • Использование List вместо массива
    • Более гибкий, с ним гораздо проще работать, использует преимущества Java Collections Framework и т. Д.
  • Не хранить символ валюты и числовой обменный курс в одной смешанной сумке
    • ... но используя класс для инкапсуляции пары
  • Использование Scanner.nextDouble() для чтения числового обменного курса (который, по-видимому, в любом случае вы захотите преобразовать в double)

Итак, как-то так:

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

Обратите внимание, как:

  • Вам больше не нужно знать, сколько элементов выделить в массиве
  • Символ и скорость не все брошены в одну смешанную сумку
  • List.add означает отсутствие счетчика, который нужно отслеживать и управлять
    • т.е. ошибка в исходном вопросе!
0 голосов
/ 10 апреля 2010

Еще одна потенциальная проблема: FileReader использует кодировку платформы по умолчанию. Это может быть подходящим для обработки предоставленных пользователем файлов, но если файлы являются частью приложения, они могут быть повреждены при запуске приложения в системе с несовместимой кодировкой по умолчанию (и нет, использование только символов ASCII не защищает вас от этого полностью).

Чтобы избежать этой проблемы, используйте вместо нее новый InputStreamReader(new FileInputStream(filename), encoding) и поймите, что вам действительно нужно выбрать encoding для вашего файла.

0 голосов
/ 10 апреля 2010

Я думаю, проблема в том, что строка 5, которая содержит ваш цикл while, читает весь входной файл. Таким образом, вы читаете весь файл на первой итерации цикла for, где i = 0; В следующий раз, когда в вашем цикле for не останется ничего прочитать.

Вы, вероятно, хотите что-то вроде этого:

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