1
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 文件中的最后一个字符块,将它们放在 rate[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)
4

4 回答 4

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

用简单的英语,这就是说:当还有标记时,将下一个标记放入rates[i].

所以它会将第一个令牌放入rates[i],然后将下一个令牌放入rates[i],然后将下一个令牌放入rates[i]... ,最后将最后一个令牌放入rates[i]。由于i未修改,所有值都写入数组的同一元素,覆盖先前读取的值。

于 2010-04-10T13:21:29.257 回答
1

我建议:

  • 使用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意味着没有您需要跟踪和管理的计数器
    • 即您原始问题中的错误!
于 2010-04-10T15:37:17.850 回答
0

我认为问题在于包含您的 while 循环的第 5 行读取了整个文件输入。for因此,您在 i = 0; 的第一次循环迭代中读取了整个文件;下次你的for循环没有什么可读的了。

你可能想要这样的东西:

List rates = new ArrayList();
while (s.hasNext()) {
      rates.add(s.next());
}
于 2010-04-10T13:26:43.903 回答
0

另一个潜在问题:FileReader使用平台默认编码。这可能适合处理用户提供的文件,但如果文件是应用程序的一部分,当应用程序在具有不兼容默认编码的系统上运行时,它们可能会损坏(不,仅使用 ASCII 字符不能保护您完全反对这一点)。

为避免此问题,请改用 new InputStreamReader(new FileInputStream(filename), encoding)- 并意识到您实际上必须encoding为您的文件选择一个。

于 2010-04-10T15:47:12.960 回答