我在使用FileReader将txt文件写入数组(Java)时遇到问题,我做错了什么?

时间:2010-04-10 13:12:04

标签: java java.util.scanner bufferedreader filereader

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)

4 个答案:

答案 0 :(得分:3)

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

用简单的英语,这说:当剩下令牌时,将下一个令牌放入rates[i]

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

答案 1 :(得分: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表示您无需跟踪和管理的计数器
    • 即。你原来问题中的错误!

答案 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