如何在Java中将用户输入排序为文本文件



我有一个程序,接受用户输入并在文本文件中设置学生,我想使用平均成绩将这些学生分类在单独的文本文件中

import java.nio.file.*;
import java.io.*;
import static java.nio.file.StandardOpenOption.*;
import java.util.Scanner;

public class NewClass2
{
public static void main(String[] args)
{


String recOut = "";
String delimiter = ",";
Scanner input = new Scanner(System.in);
final int QUIT = 999;

NewClass1 student = new NewClass1();

try
{    


System.out.println("Enter Student ID: ");
student.setStudentId(input.nextInt());

while(student.getStudentId() != QUIT)
{
System.out.println("Enter Student Last Name: ");
student.setLastName(input.next());

System.out.println("Enter Student First Name: ");
student.setFirstName(input.next());

System.out.println("Enter Student Grade Point: ");
student.setGradePoint(input.nextDouble());





if(student.getGradePoint()>=3.6)
{
Path fileOut = Paths.get("HonorsStudentList.txt");
OutputStream output = new BufferedOutputStream(Files.newOutputStream(fileOut, CREATE));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output));
recOut = student.getStudentId() + delimiter + student.getLastName() + delimiter + student.getFirstName() + delimiter + student.getGradePoint();
writer.write(recOut, 0,recOut.length());
writer.newLine();
writer.close();

}

if(student.getGradePoint()<3.6 && student.getGradePoint()>=2.0)
{
Path fileOut = Paths.get("GoodStandingStudentList.txt");
OutputStream output = new BufferedOutputStream(Files.newOutputStream(fileOut, CREATE));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output));
recOut = student.getStudentId() + delimiter + student.getLastName() + delimiter + student.getFirstName() + delimiter + student.getGradePoint();
writer.write(recOut, 0,recOut.length());
writer.newLine(); 
writer.close();

}  
if(student.getGradePoint()<2.0)
{
Path fileOut = Paths.get("ProbationStudentList.txt");
OutputStream output = new BufferedOutputStream(Files.newOutputStream(fileOut, CREATE));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output));
recOut = student.getStudentId() + delimiter
+ student.getLastName() + delimiter
+ student.getFirstName() + delimiter
+ student.getGradePoint();
writer.write(recOut, 0,recOut.length());
writer.newLine();
writer.close();

}

System.out.println("Enter Student ID: ");
student.setStudentId(input.nextInt());
}


}
catch(Exception e)
{
System.out.println("<<Something bad happened!>>");
System.out.println(e.getMessage());
}
}
}

我一直在尝试if语句,但这不起作用,因为我无法正确关闭编写器,导致它只接收一行,然后停止。

如何正确执行此操作?

问题不在于如何关闭文件,而在于如何打开文件。每次打开文件时,都会创建一个新文件并写入一行,然后关闭它,这将覆盖以前存在的旧文件。如果文件不存在,您要做的是创建该文件,但如果它确实存在,则追加一行。

只需更改

Files.newOutputStream(fileOut, CREATE)

Files.newOutputStream(fileOut, CREATE, APPEND)

或者,您可以打开/关闭循环外的文件,也可以使用"尝试使用资源"。

由于这只是三个文件,因此在开始时同时打开所有三个编写器并将其打开到结束可能是最简单的。

如果您不想手动关闭编写器(我认为至少是java7或8(,可以使用try-with-resources语句。

顺便说一句,您可能不需要将OutputStream封装在BufferedOutputStream中,因为您已经使用了缓冲写入程序。

与其每次都写在文件中,不如试着列出三个列表(每个年级一个(,当你没有更多的学生时,把它们写到单独的文件中。类似这样的东西:

List<Student> honorsStudent = new ArrayList<Student>();
List<Student> goodStandingStudent = new ArrayList<Student>();
List<Student> probationStudent = new ArrayList<Student>();

// ....

if (student.getGrade() >= 3.6) {
honorsStudent.add(student);
} else if (student.getGrade() >= 2) {
goodStandingStudent.add(student);
}
else {
probationStudent.add(student);
}
//while loop end
//write your files

最新更新