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文件中的最后一个字符块,将它们放在rates [0]中,在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)
答案 0 :(得分:3)
while(s.hasNext()){rates[i] = s.next();}
用简单的英语,这说:当剩下令牌时,将下一个令牌放入rates[i]
。
因此,它会将第一个标记放入rates[i]
,然后将下一个标记放入rates[i]
,然后将下一个标记放入rates[i]
,...,最后将最后一个标记放入rates[i]
{1}}。由于未修改i
,因此所有值都写入数组的同一元素,覆盖先前读取的值。
答案 1 :(得分:1)
我建议:
List
代替数组
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
表示您无需跟踪和管理的计数器
答案 2 :(得分:0)
我认为问题在于包含while循环的第5行读取整个文件输入。所以你在第一个for
循环迭代中读取整个文件,其中i = 0;下次for
循环时,没有什么可读的。
你可能想要这样的东西:
List rates = new ArrayList();
while (s.hasNext()) {
rates.add(s.next());
}
答案 3 :(得分:0)
另一个潜在问题:FileReader
使用平台默认编码。这可以适合处理用户提供的文件,但如果文件是应用程序的一部分,当应用程序在具有不兼容的默认编码的系统上运行时,它们可能会损坏(并且,仅使用ASCII字符不完全不受此保护。)
要避免此问题,请改用新的InputStreamReader(new FileInputStream(filename), encoding)
- 并意识到您实际上必须为您的文件选择encoding
。