我遇到了一个问题,我必须读取用户提供的文件,然后计算姓名、成绩等。但我遇到的问题是,我需要获取这些数据,并将其存储在一个名为report.txt的文本文件中,然后从第一个文件中获取数据,然后计算所有分数的平均值。我在输出任何内容时遇到问题,但当我执行System.out时,它会正确打印出来,但我认为我没有正确地将其存储在report.txt文件中。任何帮助都将不胜感激。代码:
import java.util.Scanner;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.IOException;
public class LabProgram {
public static void main(String[] args) throws IOException {
Scanner scnr = new Scanner(System.in);
/* TODO: Declare any necessary variables here. */
FileInputStream fileByteStream = null; // File input stream
Scanner inFS = null; // Scanner object
FileOutputStream fileStream = null;
PrintWriter outFS = null;
String userInput = scnr.nextLine();
String firstName;
String lastName;
int midTerm1Score;
int midTerm2Score;
int finalScore;
int avgScore;
char letterGrade;
int midTerm1Total = 0;
int midTerm2Total = 0;
int finalTotal = 0;
double midTerm1Avg;
double midTerm2Avg;
double finalAvg;
int counter = 0;
/* TODO: Read a file name from the user and read the tsv file here. */
// Try to open file
fileByteStream = new FileInputStream(userInput);
inFS = new Scanner(fileByteStream);
/* TODO: Compute student grades and exam averages, then output results to a text file here. */
fileStream = new FileOutputStream("report.txt");
outFS = new PrintWriter(fileStream);
while (inFS.hasNext()) {
firstName = inFS.next();
lastName = inFS.next();
midTerm1Score = inFS.nextInt();
midTerm1Total = midTerm1Total + midTerm1Score;
midTerm2Score = inFS.nextInt();
midTerm2Total = midTerm2Total + midTerm2Score;
finalScore = inFS.nextInt();
finalTotal = finalTotal + finalScore;
avgScore = (midTerm1Score + midTerm2Score + finalScore) / 3;
if (avgScore >= 90) {
letterGrade = 'A';
}
else if ( avgScore >= 80) {
letterGrade = 'B';
}
else if (avgScore >= 70) {
letterGrade = 'C';
}
else if (avgScore >= 60) {
letterGrade = 'D';
}
else {
letterGrade = 'F';
}
outFS.println(firstName + " " + lastName + " " + midTerm1Score + " " + midTerm2Score + " "
+ finalScore + " " + letterGrade);
counter++;
}
midTerm1Avg = (double) midTerm1Total / counter;
midTerm2Avg = (double) midTerm2Total / counter;
finalAvg = (double) finalTotal / counter;
outFS.println("");
outFS.printf("Averages: Midterm1 %.2f", midTerm1Avg);
outFS.printf(", Midterm2 %.2f", midTerm2Avg);
outFS.printf(", Final %.2f", finalAvg);
outFS.close();
fileByteStream.close(); // close() may throw IOException if fails
}}
PrintWriter
不直接将数据写入磁盘。相反,它将数据存储在内部缓冲区中,直到调用flush()
,因为一次将大块数据写入磁盘比重复写入小部分数据更快。在关闭PrintWriter
之前调用outFS.flush()
。
顺便说一句,这是一个很好的做法,让流,作家等尝试资源块,而不是手动关闭它们。