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

序列化问题;ObjectInputStream类中的readobject()方法的问题;... 序列化问题;
ObjectInputStream类中的readobject()方法的问题;
展开
 我来答
百度网友9308069
推荐于2018-03-23 · TA获得超过1万个赞
知道大有可为答主
回答量:3947
采纳率:89%
帮助的人:1877万
展开全部
ObjectInputStream本身不一定用在文件上,不关心数据是否来自文件,或是否到文件尾
ois.available()返回还能读取的字节数。到尾会返回0,超过会抛出IO异常
if(ois.available()>0){
没到尾
}else 到尾
追问
能否举一个实例?
我用过while((ois.available())!=-1){ }这个;
也用过Vector和ArrayList来遍历读取文件中的信息,都不行;
请举一个实例,谢谢!
追答
确实,available没啥用。改用捕获EOFException异常了

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Test {
static public void main(String 参数[]){
try{
//输几个对象
int a[]={1,3,5,7,9};
//Integer a[]={new Integer(1),new Integer(3),new Integer(5)};
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(baos);
for(int i:a){
//作为多个对象输入,而不是单个数组对象
oos.writeObject(new Integer(i));
}
//输到b中
byte b[]=baos.toByteArray();
oos.close();baos.close();
ObjectInputStream ois=new ObjectInputStream(new ByteArrayInputStream(b));
while(true){
try{
Integer i=(Integer)ois.readObject();
System.out.println(i);
}catch (EOFException e) {
break;//遇到EOF跳出循环
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
=======
1
3
5
7
9
不定数量的对象的输入输出。一般来说,还是要先记录对象的数量的。
百度网友1830aac
2012-02-08 · 超过33用户采纳过TA的回答
知道答主
回答量:137
采纳率:0%
帮助的人:100万
展开全部
ObjectInputStream类中的readobject()方法返回的是一个对象,即把序列化在IO流中的字节码,读取到内存当中,还原成为java对象。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
花香天地
2012-02-09 · TA获得超过342个赞
知道小有建树答主
回答量:137
采纳率:100%
帮助的人:112万
展开全部
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对象返回。大概就是这样吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式