java,不是数组时将计算值打印到文件?

时间:2013-11-11 04:30:57

标签: java printing printwriter

该程序计算9个行星的表面重力,在格式化的表格中将数据打印到屏幕上,并且应该只将surfaceGravity值打印到文件中。 我不确定为什么我的代码不会将计算出的surfaceGravity值打印到名为gravities2.txt的文件中。有人可以提供一些启示吗?是不是因为重力数据没有放入数组中 - 它只是循环的值?

import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;

public class GravityV1
{   
   //print the data to screen
   public static void printResults(String[] names, double[] diameter, double[] mass, int x)
   {
     System.out.printf("%-10s%21.2f%20.4e",names[x],diameter[x],mass[x]);   
   }

   //calculate the surface gravity
   public static double calcGravity(double m, double d)throws IOException
   { 
      double gravity = 0.0;    

      gravity = (((6.67E-11) * (m)) / (Math.pow((d) / 2, 2)));

      printToFile(gravity);     

      return gravity;        
   }

   //writes gravity data to a text file
   public static void printToFile(double gravity)throws IOException
   { 
       File gravities = new File("gravity2.txt"); 

       PrintWriter outFile = new PrintWriter(gravities);

       outFile.printf("%2.2f\n", gravity);
   }

   //main method
   public static void main (String [ ] args) throws IOException
   {        
      double[] mass = { 3.30E23, 4.869E24, 5.972E24, 6.4219E23, 1.900E27, 5.68E26, 8.683E25, 1.0247E26, 1.27E22 };

      double[] diameter = { 4880000, 12103000.6, 12756000.3, 6794000, 142984000, 120536000, 51118000, 49532000, 2274000 };

      String[] names = { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto" };

      System.out.printf("%-7s%20s%20s%20s\n","Planet Name","Diameter","Mass(kg)", "g (m/s^2)");    
      System.out.println("=============================================================================");

      for (int x = 0; x < 9; x++) {
         printResults(names, diameter, mass, x);

         double surfaceGravity = calcGravity(mass[x], diameter[x]);

         System.out.printf("%17.2f\n", surfaceGravity);         
      }  

   System.out.println();
  }  
}

屏幕输出正确,但遗憾的是文件中没有任何内容。该文件确实已创建,所以我认为这是一件好事...非常感谢任何帮助!!

3 个答案:

答案 0 :(得分:4)

您需要关闭并刷新PrintWriter。这是因为PrintWriter&#34;缓冲区&#34;您的输出,或保存它,只有在有相当数量的情况下才会写入(这有助于您的程序更快,因为它导致更少的大写而不是很多小写)。关闭或刷新文件会强制它写入。

在函数末尾添加outFile.close()会有所帮助,虽然您应该尝试重构代码,这样您就不必经常创建新的编写器,并且只需关闭一个编写器完了!

答案 1 :(得分:1)

两个问题:

1 - 你永远不会关闭PrintWriter。完成写作后,您需要调用outFile.close()

2 - 因为你在main方法的循环中调用了printToFile方法,并且每次调用该方法都会创建一个新的PrintWriter对象,你将有效地结束with是一个只包含循环中最后一颗行星的文件。

要解决最后一个问题,我会在创建循环之前创建一个PrintWriter,并在每次调用它时将其传递给printToFile方法。请记住循环后close()

答案 2 :(得分:0)

尝试在printf方法调用时添加flush。

outFile.flush();