我不明白为什么我无法从文件中读取。我总是使用 BufferedReader 的 Readline()方法获得 null
TestStudent类应该能够执行以下功能:
使用存储在名为students.txt的文本文件中的学生数据创建名为studentList的Student对象的ArrayList对象(您应该创建此文件,使其最初存储学生姓名和几个学生的ID - 每个学生一行) 允许用户向ArrayList添加与用户请求一样多的新Student对象,确保每个学生都有唯一的学生ID 当用户将新学生添加到列表中时,程序将覆盖students.txt文件,使其包含与新学生以及原始学生相关的数据。 能够在必要时显示完整的学生列表以及现有的学生ID
这是我到目前为止所做的事情。
import java.util.*;
import java.io.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.ArrayList;
public class TestStudent {
public static void main(String[] args) throws IOException {
File f=new File("C:\\Users\\user1\\Desktop\\Students.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
// FileReader reads text files in the default encoding.
FileReader fileReader =
new FileReader(f);
// Always wrap FileReader in BufferedReader.
BufferedReader bufferedReader =
new BufferedReader(fileReader);
//File f=new File("Student.txt");
Scanner sc=new Scanner(System.in);
Scanner scan = new Scanner(f);
ArrayList<Student> studentList = new ArrayList<>();
String cont;
do {
System.out.println("Enter Student Name:");
String name=sc.next();
System.out.println("Enter Student ID:");
String id=sc.next();
bw.write(name);
bw.write("\t"+id);
bw.newLine();
System.out.println("Continue Adding?");
cont=sc.next();
}
while(cont.equalsIgnoreCase("y"));
while(bufferedReader.readLine() != null){
String line = bufferedReader.readLine();
String[] record = line.split("\t");
Student myStudent =new Student(record[0],record[1]);
studentList.add(myStudent);
}
for(Student st:studentList)
System.out.println(st.Name+" "+st.Id);
bw.close();
scan.close();
sc.close();
}
}
class Student{
String Name, Id;
with default value red
Student(String string, String string0) {
System.out.println("s");
}
//Following are Mutators methos
public String getName() {
return this.Name;
}
public String getId() {
return this.Id;
}
//Following are accessor Methods
public void setName(String s){
this.Name=s;
}
public void setID(String ID) {
this.Id = ID;
}
public String toString() {
return "Student name is "+getName()+" Student Id is "+getId();
}
public boolean isValidID() {
if(getId().length()!=6)
return false;
else{
for(int i=0;i<getId().length();i++){
if(Id.charAt(i)>'9'||Id.charAt(i)<'0')
return false;
}
return true;
}
}
public boolean IDExists(Student other) {
if(other.getId().equals(this.getId()))
return true;
else
return false;
}
}
答案 0 :(得分:0)
问题在于:
while(bufferedReader.readLine() != null){
String line = bufferedReader.readLine();
...
}
对readLine()
的第一次调用会读取该行,但不会分配它 - 它会丢失。下一次调用readLine()
会读取 next 行。
应该是:
String line = null;
while ((line = bufferedReader.readLine()) != null){
....
}
这将读取下一行,将其分配给line
,然后与null
进行比较。
然后,您的学生构造函数被破坏了:
Student(String string, String string0) {
System.out.println("s");
}
您永远不会将string
和string0
分配给任何内容,Id
和Name
未分配且始终null
。
您的代码无法编译:
String Name, Id;
with default value red
这是语法错误。
了解How to create a Minimal, Complete, and Verifiable example以确保您的代码正常运行,并且您的问题一次只关注一个问题。只需确保单独测试程序的每个部分并确保它实际编译,大部分问题都将消失。
答案 1 :(得分:-1)
您忘记在构造函数
中为新Object分配studentID和studentNameStudent(String string, String string0) {
System.out.println("s");
id = string;
name = string0;
}
并且因为您编写并读取了相同的文件,因此您必须在阅读之前关闭fileWriter
do {
// your code
}
while(cont.equalsIgnoreCase("y"));
// close buffer writer before reading
bw.close()
String line;
while((line = bufferedReader.readLine()) != null){
String[] record = line.split("\t");
Student myStudent =new Student(record[0],record[1]);
studentList.add(myStudent);
}