readobject()方法怎么判断是否到达文件末尾?
3个回答
展开全部
ObjectInputStream本身不一定用在文件上,不关心数据是否来自文件,或是否到文件尾
ois.available()返回还能读取的字节数。到尾会返回0,超过会抛出IO异常
if(ois.available()>0){
没到尾
}else 到尾
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
不定数量的对象的输入输出。一般来说,还是要先记录对象的数量的。
展开全部
ObjectInputStream类中的readobject()方法返回的是一个对象,即把序列化在IO流中的字节码,读取到内存当中,还原成为java对象。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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对象返回。大概就是这样吧。
throws IOException,
ClassNotFoundException从 ObjectInputStream 读取对象。对象的类、类的签名和类及所有其超类型的非瞬态和非静态字段的值都将被读取。可以使用 writeObject 和 readObject 方法为类重写默认的反序列化。由此对象引用的对象是可传递读取的,这样 readObject 即可重新构造这些对象的完全等价的图形。
通过完全还原根对象的所有字段及其引用的对象来完全还原根对象。此时,对象验证回调的执行顺序基于其注册优先级。回调在其个别还原时由对象(按照 readObject 特定方法)进行注册。
当 InputStream 中出现问题或者遇到不应反序列化的类时,将抛出异常。所有异常对于 InputStream 而言都是致命的,将使其处于不确定状态;这将持续到调用方忽略或恢复流状态。
指定者:
接口 ObjectInput 中的 readObject
返回:
从流读取的对象
抛出:
ClassNotFoundException - 找不到序列化对象的类。
InvalidClassException - 序列化使用的类出了问题。
StreamCorruptedException - 流中的控制信息不一致。
OptionalDataException - 在流中而不是对象中找到了基本数据。
IOException - 任何常规的输入/输出相关的异常。
-------------------------------------------------------
读取成功返回一个对象 Object,失败则会返回异常,你可以利用捕获异常判断是否成功,判断是对象来表示成功。不好判断是否在文件末尾。
另外Object形成原理:我的理解是,在writeObject的时候,是把对象的引用内存的信息按二进制方式(也就是byte数组)输出到某个输出流,而readObject的时候,首先取到输入流的内容,也是一个二进制的byte数组,然后根据一些算法(比如第几个字节到第几个字节代表对象的类,第几个到第几个代表某个属性的内容等等),得到相应的信息后系统自动生成一个实例,然后分别去设置每个属性,最后以Object对象返回。大概就是这样吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询