输入I/O作业中的JAVA错误(初学者)
如果瓶盖有五分之一的机会获奖,我必须编写一个程序来估计一个人为了获奖必须喝多少瓶酒。用户输入打开瓶子的试验次数,程序输出赢得奖品的平均瓶数,并在单独的文本文件中存储每个试验赢得的饮料数量输入I/O作业中的JAVA错误(初学者),java,file,io,printwriter,Java,File,Io,Printwriter,如果瓶盖有五分之一的机会获奖,我必须编写一个程序来估计一个人为了获奖必须喝多少瓶酒。用户输入打开瓶子的试验次数,程序输出赢得奖品的平均瓶数,并在单独的文本文件中存储每个试验赢得的饮料数量 import java.io.IOException; import java.io.PrintWriter; import java.util.Scanner; import java.io.File; public class BottleCapPrize2 { public static void ma
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.io.File;
public class BottleCapPrize2
{
public static void main (String[] args) throws IOException
{
Scanner in = new Scanner (System.in);
System.out.print("Number of Trials: ");
int trials = in.nextInt();
int trialNumber = 0;
int total = 0;
int average = 0;
for (int x = 0; x < trials; x++){
int counter = 0;
double randNum = Math.random();
trialNumber++;
while (randNum < 0.8){
counter ++;
randNum = Math.random();
}
total += counter;
average = (int) total/trials;
PrintWriter outFile = new PrintWriter (new File ("bottleCap.txt"));
outFile.println("Trial " + trialNumber + " took " + counter + " drinks.");
outFile.close();
if (trialNumber == trials){
System.out.println("The average was " + average);
}
}
}
import java.io.IOException;
导入java.io.PrintWriter;
导入java.util.Scanner;
导入java.io.File;
公共类瓶装水2
{
公共静态void main(字符串[]args)引发IOException
{
扫描仪输入=新扫描仪(系统输入);
系统输出打印(“试验次数:”);
int trials=in.nextInt();
int trialNumber=0;
int-total=0;
整数平均=0;
对于(int x=0;x
程序中输出到编译器的部分工作正常,但输出到文本文件(bottleCap.txt)的部分工作不正常
当我打开bottleCap.txt时
“试验1喝了3杯”,“试验2喝了5杯”,“试验10喝了9杯。”应该写出来。
相反,我只看到程序最后一次试用的输出(如果用户输入了10次试用,那么文本文件只写了“试用10喝了3杯”,而试用1-9则没有任何内容)
有人能帮我解决这个问题吗?我已经看了几个小时了,没有任何进展。谢谢
**谢谢大家的帮助!这非常有帮助!***使用
附加标志设置为真的而不是PrintWriter
FileWiter outFile = new FileWriter(new File("bottleCap.txt"), true);
正在创建时,会将现有文件截断为零大小,因此所有以前的输出都将被删除。在附加模式下使用FileWriter
将输出附加到现有文件
或者,您可以将PrintWriter
的创建移到循环之外,从而防止多次创建它并截断文件。将打开文件操作移到循环之外,这样您只需打开一次即可写入缓冲区,然后将所有字符串刷新到文件中
PrintWriter outFile = new PrintWriter (new File ("bottleCap.txt"));
for (int x = 0; x < trials; x++){
int counter = 0;
double randNum = Math.random();
trialNumber++;
while (randNum < 0.8){
counter ++;
randNum = Math.random();
}
total += counter;
average = (int) total/trials;
outFile.println("Trial " + trialNumber + " took " + counter + " drinks.");
if (trialNumber == trials){
System.out.println("The average was " + average);
}}
outFile.close();
PrintWriter outFile=新的PrintWriter(新文件(“bottleCap.txt”);
对于(int x=0;x
问题在于每次都创建一个新文件。对于每个循环,您创建一个文件并写入,然后创建一个新的空文件并写入
因此,您必须声明打印编写器已退出循环
PrintWriter outFile = new PrintWriter (new File ("bottleCap.txt"));
for (int x = 0; x < trials; x++){
int counter = 0;
double randNum = Math.random();
trialNumber++;
while (randNum < 0.8){
counter ++;
randNum = Math.random();
}
total += counter;
average = (int) total/trials;
outFile.println("Trial " + trialNumber + " took " + counter + " drinks.");
if (trialNumber == trials){
System.out.println("The average was " + average);
}
outFile.close();
}
PrintWriter outFile=新的PrintWriter(新文件(“bottleCap.txt”);
对于(int x=0;x
此外,您不应该每次循环时都关闭文件,建议使用BufferedWriter
和FileWriter
链,关键点是FileWriter
在使用其构造函数之一时会将字符串附加到当前文件中,该构造函数允许通过向最后一个参数添加true
来进行加载,如
new FileWriter("bottleCap.txt", true)
当我们用BufferedWriter
对象来包围它时,为了提高效率,如果你要写入文件的时间,那么它会将字符串缓冲在大块中,并将大块写入一个文件,显然你可以节省大量的时间写入一个文件
注意:可以不使用BuffredWriter
,但建议使用它,因为它具有更好的性能和缓冲大块字符串并将其写入一次的能力
只要换个衣服就行了
PrintWriter out = new PrintWriter("bottleCap.txt");
到
例如:
try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("bottleCap.txt", true)));){
String data = " This content will append to the end of the file";
File file =new File("bottleCap.txt");
out.println(data);
}catch(IOException e){
}
try (PrintWriter out = new PrintWriter(new FileWriter("bottleCap.txt", true));) {
String data = " This content will append to the end of the file";
File file = new File("bottleCap.txt");
out.println(data);
} catch (IOException e) {
}
不使用BufferedWriter
就可以解决这个问题,但是正如我所提到的,性能会很低
例如:
try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("bottleCap.txt", true)));){
String data = " This content will append to the end of the file";
File file =new File("bottleCap.txt");
out.println(data);
}catch(IOException e){
}
try (PrintWriter out = new PrintWriter(new FileWriter("bottleCap.txt", true));) {
String data = " This content will append to the end of the file";
File file = new File("bottleCap.txt");
out.println(data);
} catch (IOException e) {
}
建议:
将您的PrintWriter
移出for循环,以避免多次生成bottleCap.txt
文件
将这些行也移出for循环
total+=计数器;
平均值=(整数)总计/试验;
检查for循环块。将outFile的创建和关闭移到循环之外。如果没有另外指定,新打开的文件将从开始写入。打开文件也需要时间。@jinjin11我的问题是,您的数据会互相覆盖吗?