У меня проблемы с помощью Fileheader, чтобы написать файл TXT в массив (Java), что я делаю не так?

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

Вопрос

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();
        }
    }

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

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)
Это было полезно?

Решение

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

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

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

Другие советы

Рекомендую:

  • С использованием 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 означает отсутствие счетчика того, что вам нужно отслеживать и управлять
    • Т.е. ошибка в вашем оригинальном вопросе!

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top