该程序计算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();
}
}
屏幕输出正确,但遗憾的是文件中没有任何内容。该文件确实已创建,所以我认为这是一件好事...非常感谢任何帮助!!
答案 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();