我仍然对为什么该程序无法产生我期望的结果感到困惑

时间:2018-06-24 03:10:31

标签: java java.util.scanner inputstream filewriter printwriter

我仍然不知道为什么该程序不计算并给出我认为会的结果。

我正在尝试使用PrintWriter类的实例将用户在for循环中指定的多个浮点值写入用户命名为Numbers.txt的文本文件。

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

尽管如此,总变量的值仍为0.0,而不是文件中那些浮点值的累积。

我是Java的新手,尤其是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);
  }}

这是程序输出:

  

输入文件名:Numbers.txt

     

输入文件中的浮点值的数量:2

     

浮点数1:4.5

     

浮点数2:3.2

     

Numbers.txt中的总值:0.0

1 个答案:

答案 0 :(得分:1)

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

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

只需在代码中向上移动outputFile.close();行,这样就可以在新文件上创建扫描程序之前就可以了! 文件将被写入,然后您可以将其打开以进行读取。

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