0

このプログラムは、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();
  }  
}

画面への出力は正しいですが、残念ながらファイルには何も含まれていません。ファイルは作成されるので、それは良いことだと思います...どんな助けも大歓迎です!!

4

3 に答える 3

4

を閉じてフラッシュする必要がありますPrintWriter。これは、PrintWriter が出力を「バッファリング」または保存し、かなりの量が保存された場合にのみ書き込みを行うためです (これにより、多くの小さな書き込みではなく大きな書き込みが少なくなるため、プログラムが高速化されます)。ファイルを閉じるかフラッシュすると、強制的に書き込みが行われます。

関数の最後に追加するoutFile.close()と役に立ちますが、コードをリファクタリングして、常に新しいライターを作成する必要がなく、完了したら 1 つのライターを単純に閉じることができるようにする必要があります。

于 2013-11-11T04:37:30.127 に答える
1

2 つの問題:

1 - を決して閉じませんPrintWriteroutFile.close()書き終わったら呼び出す必要があります。

2 -printToFileメイン メソッドのループ内からメソッドを呼び出しており、そのメソッドPrintWriterは呼び出されるたびに新しいオブジェクトを作成するため、実際には、ループ内の最後の惑星のみを含むファイルになります。

最後の問題を解決するには、ループが作成される前に を作成し、呼び出すたびPrintWriterにメソッドに渡します。ループの後にprintToFile覚えておいてください。close()

于 2013-11-11T04:39:27.423 に答える
0

printf メソッドの呼び出し時にフラッシュを追加してみてください。

outFile.flush();
于 2013-11-11T04:38:28.243 に答える