怎么样判断ObjectInputStream是否读到文件末尾,文件长度未知,!!急!!

zhyanl 2009-03-20 10:43:19
如题
...全文
1258 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
gezhonglei2007 2011-06-30
  • 打赏
  • 举报
回复 1
方法之一:(常用的方法)将若干个对象(数量不定)都装入一个容器中(如:ArrayList之类),然后将容器这一个对象写入就行了。读取时,只要读取一个对象(即容器对象)就行了。

方法之二:(若不想用容器),则由于数量不定,正是用EOFException来判断结束。代码结构如下:(无论是readInt()读int,还是readObject()读对象)
try{
while(true)
{
Object o=ois.radObject();
处理已读出的对象o;
}
}catch(EOFxception e){
//已从流中读完。
}
finallly{
流的关闭。
}

在楼上的基础上,我加入第三种方法:那就是在文件的前面先存入一个数字len,表示后面有多少个对象,在每次写入之后,更改这个数字len;每次读时,先用读出这个数字后len,再用ObjectOuputStream读出下面所有的对象,如下:
……
for(int i=0;i<len;i++){
Object o=ois.radObject();
处理已读出的对象o;
}
……
gezhonglei2007 2011-06-27
  • 打赏
  • 举报
回复
顶一下,遇到同样的问题。看到解释终于清楚了!
HinanaiTenshi 2009-03-31
  • 打赏
  • 举报
回复
13楼是回贴机器人?
捏造的信仰 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jiangnaisong 的回复:]
引用楼主 zhyanl 的帖子:
如题

答:都在瞎指挥。ObjectInputStream无论是读对象,还是记取int等java的基本数据类型,在判结束时,绝对既不是-1,也不是什么null。
若文件中有若于个int的数,你用DataInputStream中的readint()去读,何时判读到结尾?
绝对既不是-1,也不是什么null
同样道理:若文件中有若于个Object对象,你用ObjectInputStream中的readObject()去读,何时判读到结尾?
绝对既不是-1,也不是什么null


[/Quote]

就是这样了。PS:楼主我教你怎么贴代码:
1、将代码作良好的格式化,以方便阅读。
2、在发帖文本框的上方单击字体颜色右边的按钮,选择 Java
3、将代码粘贴到【code=Java】和【/code】之间。就会得到下面的效果:

public class Hello {

public static void main(String[] args) {
System.out.println("Hello!");
}
}
HinanaiTenshi 2009-03-31
  • 打赏
  • 举报
回复
忘记说了,末尾的返回值只和方法有关,同类关系不大。
ObjectInputStream同样有继承自超类的read()方法,-1代表读取到末尾或者无数据可用(^╴^A;)
HinanaiTenshi 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用回复:]
答:都在瞎指挥。ObjectInputStream无论是读对象,还是记取int等java的基本数据类型,在判结束时,绝对既不是-1,也不是什么null。
[/Quote]
ObjectInputStream读到基本数据直接抛出OptionalDataException

[Quote=引用回复:]
绝对既不是-1,也不是什么null
[/Quote]
参考jdk文档里的方法说明
如果返回值是int(比如read()方法),那么-1代表读取到末尾
原文(Jet Mah中文版jdk)为:
“如果因为该流在文件未尾而无字节可用,则返回 -1 值;”

如果返回值是一个对象(比如readObject()方法),那么没有比较统一的处理,参考具体文档吧╮( ̄▽ ̄)╭
goodmrning 2009-03-21
  • 打赏
  • 举报
回复
你的文件存放的是什么对象?要用ObjectInputStream
zhyanl 2009-03-21
  • 打赏
  • 举报
回复
private Vector<LogRecord> activate(String loginFilename)throws InitException {
ObjectInputStream ois = null;
try {
FileInputStream fis=new FileInputStream(loginFilename);
ois=new ObjectInputStream(fis);
while(ois.available()!=-1){//这里如何判断是否已经读到结尾?
logins.add((LogRecord)ois.readObject());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new InitException("采集属性文件没有设置");
}catch (Exception e) {
e.printStackTrace();
throw new InitException("采集属性文件读取错误");
}
return logins;
}

在判断的地方改成ois.read()!=-1结果仍然后抛出EOF异常!!
zhyanl 2009-03-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 spiniper 的回复:]
读到字节为-1就是末尾了,这有什么难度么?
[/Quote]要一个一个对象读
老紫竹 2009-03-21
  • 打赏
  • 举报
回复
就是,读取到的byte[]的长度为-1, 就读取完毕了。





zhyanl 2009-03-21
  • 打赏
  • 举报
回复
是Object对象
successgl 2009-03-21
  • 打赏
  • 举报
回复
学习
云上飞翔 2009-03-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhyanl 的帖子:]
如题
[/Quote]
答:都在瞎指挥。ObjectInputStream无论是读对象,还是记取int等java的基本数据类型,在判结束时,绝对既不是-1,也不是什么null
若文件中有若于个int的数,你用DataInputStream中的readint()去读,何时判读到结尾?
绝对既不是-1,也不是什么null
同样道理:若文件中有若于个Object对象,你用ObjectInputStream中的readObject()去读,何时判读到结尾?
绝对既不是-1,也不是什么null

方法之一:(常用的方法)将若干个对象(数量不定)都装入一个容器中(如:ArrayList之类),然后将容器这一个对象写入就行了。读取时,只要读取一个对象(即容器对象)就行了

方法之二:(若不想用容器),则由于数量不定,正是用EOFException来判断结束。代码结构如下:(无论是readInt()读int,还是readObject()读对象)
try{
while(true)
{
Object o=ois.radObject();
处理已读出的对象o;
}
}catch(EOFxception e){
//已从流中读完。
}
finallly{
流的关闭。
}

以上仅供楼主参考
树成 2009-03-21
  • 打赏
  • 举报
回复
如果是网络流,那么available()函数是没有用的。
如果是本地文件流,那么这个函数返回的是这个流可以读多少字节,而不是判断available()是不是返回-1.
如果你嫌一个字节一个字节读得太慢,那你用bufferedIutputStream封装一下就好。
axman 2009-03-21
  • 打赏
  • 举报
回复
直接判断读到的是否为null.因为你读的是引用类型
树成 2009-03-21
  • 打赏
  • 举报
回复
读到字节为-1就是末尾了,这有什么难度么?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧