同时使用FileInputStream和FileOutputStream



我遇到了一个问题,我必须读取用户提供的文件,然后计算姓名、成绩等。但我遇到的问题是,我需要获取这些数据,并将其存储在一个名为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()

顺便说一句,这是一个很好的做法,让流,作家等尝试资源块,而不是手动关闭它们。