我仍然对为什么这个程序没有产生我期望的结果感到困惑

I'm still baffled as to why this program doesn't produce the result that i expect it would

我仍然不明白为什么这个程序没有计算并给出我认为会的结果。

我正在尝试使用 PrintWriter class 的实例将用户在 for 循环中指定的几个浮点值写入用户命名为 Numbers.txt.

然后我创建了扫描仪的对象 inputFile class 并使用 hasNext 方法在 while 循环中读取这些值,在循环中计算它们并将结果分配给 total 变量;一个累加器初始化为 0.0.

尽管如此,total变量的值仍然是0.0,而不是文件中那些浮点值的累加。

我是 Java 的新手,尤其是编程方面的新手,所以请有人帮助我确定哪里出了问题以及如何修复它以获得预期的结果。

提前致谢!下面是我写的代码部分:

public class FileSum {
   public static void main(String[] args) throws IOException {
      double individualValues, total = 0.0; // total is an accumulator to store the sum of the values specified in Numbers.txt, thus it must be initialized to 0.0
      int numberOfValues;
    
      Scanner kb = new Scanner(System.in);
    
      System.out.print("enter the file name: ");
      String fileName = kb.nextLine();
    
      System.out.print("enter the number of floating-point values in the file: ");
      numberOfValues = kb.nextInt();
    
      PrintWriter outputFile = new PrintWriter(fileName);
    
      for(int i = 1; i <= numberOfValues; i++) {
          System.out.print("the floating-point value number " + i + ": ");
          individualValues = kb.nextDouble();
          outputFile.println(individualValues);
      }
    
      File file = new File(fileName);
      Scanner inputFile = new Scanner(file);
    
      while(inputFile.hasNext()) {
          individualValues = inputFile.nextDouble();
          total = total + individualValues;
      }
    
      inputFile.close();
      outputFile.close();
      kb.close();
    
      System.out.println("the total values in Numbers.txt: " + total);
  }}

程序输出如下:

enter the file name: Numbers.txt

enter the number of floating-point values in the file: 2

the floating-point value number 1: 4.5

the floating-point value number 2: 3.2

the total values in Numbers.txt: 0.0

您似乎正在尝试从 System.in 中读取一些值,将它们写入文件,然后读取该文件并添加数字。

但是,由于直到程序结束才关闭正在写入的文件,因此无法确定在读取文件时文件内容是否已刷新到文件中。所以你很可能 inputFile.hasNext() 总是返回 false

只需在您的代码中将行 outputFile.close(); 向上移动,这样它就发生在您在新文件上创建扫描仪之前,那么您应该没问题! 文件将被写入,然后您可以打开它进行阅读。

进一步解释这是因为PrintWriter调用println时不会自动刷新它的输出。出于性能原因,它保留在缓冲区中。还有其他构造函数采用 autoFlush 布尔值。如果设置为 true,它将刷新您写入文件的值。通过调用 close,您将刷新所有等待写入的内容,然后将占用此打开文件的所有资源放在前面。