【问题标题】:I am having trouble using FileReader to write a txt file to an array (Java), what am I doing wrong?我在使用 FileReader 将 txt 文件写入数组(Java)时遇到问题,我做错了什么?
【发布时间】:2011-02-06 11:52:41
【问题描述】:
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)

【问题讨论】:

  • 你到底想对文本文件中的数据做什么?
  • 您的代码中如何定义rates

标签: java java.util.scanner bufferedreader filereader


【解决方案1】:
while(s.hasNext()){rates[i] = s.next();}

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

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

【讨论】:

  • 确实是+1,很好的发现! @deliriumtremens 不要忘记接受他的回答 :-)
【解决方案2】:

我推荐:

  • 使用List 代替数组
    • 更灵活、更易于使用、利用 Java 集合框架等
  • 不将货币符号和数字汇率都存储在一个混合包中
    • ...但是使用一个类来封装一对
  • 使用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 表示无需您跟踪和管理的计数器
    • 即您原始问题中的错误!

【讨论】:

    【解决方案3】:

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

    你可能想要这样的东西:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 2013-08-10
        相关资源
        最近更新 更多