У меня проблемы с помощью Fileheader, чтобы написать файл TXT в массив (Java), что я делаю не так?
-
25-09-2019 - |
Вопрос
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
для вашего файла.