从包含多个对象的序列化文件中读取数据
reading data from a serialized file containing multiple objects
我正在尝试从包含 class 的多个对象的文件中读取数据。但是我在将对象添加到列表时遇到空指针异常。有人可以帮忙吗?
代码如下:
//I'm following the same approach, but getting null Pointer exception while
//adding the object to a list. I'll post my code below. Can anyone help?
public class DeserializingMultipleObjects {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
//create few objects of student class and serialize them in a single file
Student st1= new Student(1, "abhishek", 24, 1);
Student st2= new Student(2, "Prashant",23,3);
Student st3= new Student(3,"Gayatri",22,2);
Student st4= new Student(4,"Ankul",23,4);
FileOutputStream fout= null;
FileInputStream fin= null;
ObjectInputStream oin=null;
ObjectOutputStream oout= null;
List <Student> studentList=null;
try{
fout= new FileOutputStream("Student.ser");
oout= new ObjectOutputStream(fout);
oout.writeObject(st1);
oout.writeObject(st2);
oout.writeObject(st3);
oout.writeObject(st4);
//objects have been serialized. Now read them and populate in a list
fin= new FileInputStream("Student.ser");
oin= new ObjectInputStream(fin);
boolean flag=false;
while(!flag){
if(oin.readObject()==null || oin.readObject().equals("")){
flag=true;
}
else{
studentList.add((Student)oin.readObject());
}
}
}
catch (ClassNotFoundException ex) {
Logger.getLogger(DeserializingMultipleObjects.class.getName()).log(Level.SEVERE, null, ex);
} finally{
if(fout !=null) try {
fout.close();
} catch (IOException ex) {
Logger.getLogger(DeserializingMultipleObjects.class.getName()).log(Level.SEVERE, null, ex);
}
if(oout !=null){
oout.close();
}
if(fin !=null){
fin.close();
}
if(oin !=null){
oin.close();
}
for(Student student: studentList){
System.out.println(student.name);
}
}
}
}
您每次迭代读取对象 3 次。
while(!flag){
Student st = oin.readObject();
if(st == null){
flag=true;
}
else{
studentList.add(st);
}
}
List <Student> studentList=null;
给出错误。当您到达要使用 studentList.add((Student)oin.readObject());
添加到 studentList
的部分时,该列表是一个空指针,因为您将其初始化为空指针。
您可能希望将列表初始化为 null 以外的值,例如List<Student> studentList = new ArrayList<Student>();
几个错误:
- 您忘记在开始读取文件
之前关闭 ObjectOutputStream
每次调用 readObject()
时,都会从流中读取下一个对象,因此以下行:
if(oin.readObject()==null || oin.readObject().equals("")){
flag=true;
}
else{
studentList.add((Student)oin.readObject());
}
读取 2 个或三个对象,而不是只读取一个。他们应该是
Object read = oin.readObject()
if(read == null || read.equals("")){
flag=true;
}
else {
studentList.add((Student) read);
}
但是 readObject()
永远不会 return null,并且 return 不可能是一个空字符串,因为您只在流中写入了 Student 的实例。
如果您将 4 个学生存储在 List<Student>
中并序列化此列表,一切都会容易得多。反序列化只包括读取一个对象(因此,不需要循环):学生列表。
此外,关闭 ObjectOutputStream 将自动关闭 FileOutputStream。 ObjectInputStream 也一样。所以关闭文件流是不必要的。为了更清洁和更安全的资源处理,您应该使用 try-with-resources.
我正在尝试从包含 class 的多个对象的文件中读取数据。但是我在将对象添加到列表时遇到空指针异常。有人可以帮忙吗?
代码如下:
//I'm following the same approach, but getting null Pointer exception while
//adding the object to a list. I'll post my code below. Can anyone help?
public class DeserializingMultipleObjects {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
//create few objects of student class and serialize them in a single file
Student st1= new Student(1, "abhishek", 24, 1);
Student st2= new Student(2, "Prashant",23,3);
Student st3= new Student(3,"Gayatri",22,2);
Student st4= new Student(4,"Ankul",23,4);
FileOutputStream fout= null;
FileInputStream fin= null;
ObjectInputStream oin=null;
ObjectOutputStream oout= null;
List <Student> studentList=null;
try{
fout= new FileOutputStream("Student.ser");
oout= new ObjectOutputStream(fout);
oout.writeObject(st1);
oout.writeObject(st2);
oout.writeObject(st3);
oout.writeObject(st4);
//objects have been serialized. Now read them and populate in a list
fin= new FileInputStream("Student.ser");
oin= new ObjectInputStream(fin);
boolean flag=false;
while(!flag){
if(oin.readObject()==null || oin.readObject().equals("")){
flag=true;
}
else{
studentList.add((Student)oin.readObject());
}
}
}
catch (ClassNotFoundException ex) {
Logger.getLogger(DeserializingMultipleObjects.class.getName()).log(Level.SEVERE, null, ex);
} finally{
if(fout !=null) try {
fout.close();
} catch (IOException ex) {
Logger.getLogger(DeserializingMultipleObjects.class.getName()).log(Level.SEVERE, null, ex);
}
if(oout !=null){
oout.close();
}
if(fin !=null){
fin.close();
}
if(oin !=null){
oin.close();
}
for(Student student: studentList){
System.out.println(student.name);
}
}
}
}
您每次迭代读取对象 3 次。
while(!flag){
Student st = oin.readObject();
if(st == null){
flag=true;
}
else{
studentList.add(st);
}
}
List <Student> studentList=null;
给出错误。当您到达要使用 studentList.add((Student)oin.readObject());
添加到 studentList
的部分时,该列表是一个空指针,因为您将其初始化为空指针。
您可能希望将列表初始化为 null 以外的值,例如List<Student> studentList = new ArrayList<Student>();
几个错误:
- 您忘记在开始读取文件 之前关闭 ObjectOutputStream
每次调用
readObject()
时,都会从流中读取下一个对象,因此以下行:if(oin.readObject()==null || oin.readObject().equals("")){ flag=true; } else{ studentList.add((Student)oin.readObject()); }
读取 2 个或三个对象,而不是只读取一个。他们应该是
Object read = oin.readObject()
if(read == null || read.equals("")){
flag=true;
}
else {
studentList.add((Student) read);
}
但是 readObject()
永远不会 return null,并且 return 不可能是一个空字符串,因为您只在流中写入了 Student 的实例。
如果您将 4 个学生存储在 List<Student>
中并序列化此列表,一切都会容易得多。反序列化只包括读取一个对象(因此,不需要循环):学生列表。
此外,关闭 ObjectOutputStream 将自动关闭 FileOutputStream。 ObjectInputStream 也一样。所以关闭文件流是不必要的。为了更清洁和更安全的资源处理,您应该使用 try-with-resources.