输入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我的问题是,您的数据会互相覆盖吗?