Java 中反序列化多个对象的条件
While Conditions for Deserializing Multiple Objects in Java
我目前正在准备对我的工作机会进行评估。所以公司给出了一些练习作业和各自的解决方案。
关于如何从序列化文件中反序列化多个对象,我遇到了一些难题。
最初,当我自己解决问题时,在研究了 FileInputStream 和 ObjectInputStream 的 class 定义后,我认为实现该目标的最佳方法是。
FileInputStream fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis);
while(fis.available()!=0)
{
obj = (Show)ois.readObject();
lst.add(obj);
}
ois.close();
fis.close();
但后来当我搜索时,我没有发现任何人建议这样做,尽管这对我来说非常有效。
公司对作业的解决方案是
in=new ObjectInputStream(new FileInputStream(fileName));
Show s=null;
while((s=(Show)in.readObject())!=null){
list.add(s);
}
但是当我尝试在另一个程序中使用后一种解决方案时,它给了我一个异常
FileInputStream fis = new FileInputStream(fileNameChannel);
ObjectInputStream ois = new ObjectInputStream(fis);
while((obj=(Channel) ois.readObject())!=null){
list.add(obj);
}
fis.close();
ois.close();
异常:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at com.psl.util.SetTopBoxManagementSystemImpl.populateByChannelCategory(SetTopBoxManagementSystemImpl.java:29)
at com.psl.main.Client.main(Client.java:18)
为了找到合适的答案,我尝试搜索 StackExchange,发现人们实际上建议捕获异常并结合使用 While(true) 进行处理。 - Link
我无法理解的是
- 为什么我不应该使用 fis.available()>0 ?或者为什么没有人?
- 相同的实现在一个程序中导致 EOFException 而在另一个程序中没有的可能原因是什么?因为两者都在提取序列化文件中存在的所有序列化对象。
- 我为什么要考虑使用 while(true) 并捕获 EOFException,如果我可以以一种只要一切正常就不会发生异常的方式实现?这似乎只是实现目标的捷径。如果确实出了问题(明智的 EOF),我们将如何解决?
readObject()
在流的末尾 return 不为空。它可以随时这样做。如果你写了一个null,它return就是null。所以你不能使用那个。
available() == 0
不是流结束的测试:请参阅 Javadoc。所以你不能使用它。
readObject()
在流的末尾抛出 EOFException
。所以用那个。
回答您的问题:
Why shouldn't I use fis.available()>0 ?
因为无阻塞可读取的字节数与流的结束无关。
or rather why doesn't anyone?
因为不行。
What might be the possible reasons that the same implementation is resulting in an EOFException in one program but not in the other?
正在向其中一个发送空值以指示流结束。这是不好的做法,因为它会阻止您将 null 用于其他任何事情。需要带外值。事实上,这里的 null does 是否意味着流结束并不清楚。您可能会过早地停止阅读。
Why should I consider using while(true) and catching EOFException
因为 API 就是这样设计的。
if it is possible for me to implement in a way that no Exception would occur as long as everything is All right?
但一切都不会永远好起来。您将得到截断的文件、断开的连接、...
It just seems like a shortcut for achieving.
这是没有意义的。
If something does go wrong(EOF wise) , how would we tackle that?
捕获异常。
我目前正在准备对我的工作机会进行评估。所以公司给出了一些练习作业和各自的解决方案。
关于如何从序列化文件中反序列化多个对象,我遇到了一些难题。
最初,当我自己解决问题时,在研究了 FileInputStream 和 ObjectInputStream 的 class 定义后,我认为实现该目标的最佳方法是。
FileInputStream fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis);
while(fis.available()!=0)
{
obj = (Show)ois.readObject();
lst.add(obj);
}
ois.close();
fis.close();
但后来当我搜索时,我没有发现任何人建议这样做,尽管这对我来说非常有效。 公司对作业的解决方案是
in=new ObjectInputStream(new FileInputStream(fileName));
Show s=null;
while((s=(Show)in.readObject())!=null){
list.add(s);
}
但是当我尝试在另一个程序中使用后一种解决方案时,它给了我一个异常
FileInputStream fis = new FileInputStream(fileNameChannel);
ObjectInputStream ois = new ObjectInputStream(fis);
while((obj=(Channel) ois.readObject())!=null){
list.add(obj);
}
fis.close();
ois.close();
异常:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at com.psl.util.SetTopBoxManagementSystemImpl.populateByChannelCategory(SetTopBoxManagementSystemImpl.java:29)
at com.psl.main.Client.main(Client.java:18)
为了找到合适的答案,我尝试搜索 StackExchange,发现人们实际上建议捕获异常并结合使用 While(true) 进行处理。 - Link
我无法理解的是
- 为什么我不应该使用 fis.available()>0 ?或者为什么没有人?
- 相同的实现在一个程序中导致 EOFException 而在另一个程序中没有的可能原因是什么?因为两者都在提取序列化文件中存在的所有序列化对象。
- 我为什么要考虑使用 while(true) 并捕获 EOFException,如果我可以以一种只要一切正常就不会发生异常的方式实现?这似乎只是实现目标的捷径。如果确实出了问题(明智的 EOF),我们将如何解决?
readObject()
在流的末尾 return 不为空。它可以随时这样做。如果你写了一个null,它return就是null。所以你不能使用那个。available() == 0
不是流结束的测试:请参阅 Javadoc。所以你不能使用它。readObject()
在流的末尾抛出EOFException
。所以用那个。
回答您的问题:
Why shouldn't I use fis.available()>0 ?
因为无阻塞可读取的字节数与流的结束无关。
or rather why doesn't anyone?
因为不行。
What might be the possible reasons that the same implementation is resulting in an EOFException in one program but not in the other?
正在向其中一个发送空值以指示流结束。这是不好的做法,因为它会阻止您将 null 用于其他任何事情。需要带外值。事实上,这里的 null does 是否意味着流结束并不清楚。您可能会过早地停止阅读。
Why should I consider using while(true) and catching EOFException
因为 API 就是这样设计的。
if it is possible for me to implement in a way that no Exception would occur as long as everything is All right?
但一切都不会永远好起来。您将得到截断的文件、断开的连接、...
It just seems like a shortcut for achieving.
这是没有意义的。
If something does go wrong(EOF wise) , how would we tackle that?
捕获异常。