readobject()方法怎么判断是否到达文件末尾?

序列化问题;ObjectInputStream类中的readobject()方法的问题;
2025-01-06 14:39:17
推荐回答(3个)
回答1:

ObjectInputStream本身不一定用在文件上,不关心数据是否来自文件,或是否到文件尾
ois.available()返回还能读取的字节数。到尾会返回0,超过会抛出IO异常
if(ois.available()>0){
没到尾
}else 到尾

回答2:

ObjectInputStream类中的readobject()方法返回的是一个对象,即把序列化在IO流中的字节码,读取到内存当中,还原成为java对象。

回答3:

public final Object readObject()
throws IOException,
ClassNotFoundException从 ObjectInputStream 读取对象。对象的类、类的签名和类及所有其超类型的非瞬态和非静态字段的值都将被读取。可以使用 writeObject 和 readObject 方法为类重写默认的反序列化。由此对象引用的对象是可传递读取的,这样 readObject 即可重新构造这些对象的完全等价的图形。
通过完全还原根对象的所有字段及其引用的对象来完全还原根对象。此时,对象验证回调的执行顺序基于其注册优先级。回调在其个别还原时由对象(按照 readObject 特定方法)进行注册。

当 InputStream 中出现问题或者遇到不应反序列化的类时,将抛出异常。所有异常对于 InputStream 而言都是致命的,将使其处于不确定状态;这将持续到调用方忽略或恢复流状态。
指定者:
接口 ObjectInput 中的 readObject
返回:
从流读取的对象
抛出:
ClassNotFoundException - 找不到序列化对象的类。
InvalidClassException - 序列化使用的类出了问题。
StreamCorruptedException - 流中的控制信息不一致。
OptionalDataException - 在流中而不是对象中找到了基本数据。
IOException - 任何常规的输入/输出相关的异常。
-------------------------------------------------------
读取成功返回一个对象 Object,失败则会返回异常,你可以利用捕获异常判断是否成功,判断是对象来表示成功。不好判断是否在文件末尾。

另外Object形成原理:我的理解是,在writeObject的时候,是把对象的引用内存的信息按二进制方式(也就是byte数组)输出到某个输出流,而readObject的时候,首先取到输入流的内容,也是一个二进制的byte数组,然后根据一些算法(比如第几个字节到第几个字节代表对象的类,第几个到第几个代表某个属性的内容等等),得到相应的信息后系统自动生成一个实例,然后分别去设置每个属性,最后以Object对象返回。大概就是这样吧。