如题

解决方案 »

  1.   

    你的文件存放的是什么对象?要用ObjectInputStream
      

  2.   

    就是,读取到的byte[]的长度为-1, 就读取完毕了。
      

  3.   

    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异常!!
      

  4.   

    直接判断读到的是否为null.因为你读的是引用类型
      

  5.   

    如果是网络流,那么available()函数是没有用的。
    如果是本地文件流,那么这个函数返回的是这个流可以读多少字节,而不是判断available()是不是返回-1.
    如果你嫌一个字节一个字节读得太慢,那你用bufferedIutputStream封装一下就好。
      

  6.   

    答:都在瞎指挥。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{
    流的关闭。
    }以上仅供楼主参考
      

  7.   

    ObjectInputStream读到基本数据直接抛出OptionalDataException参考jdk文档里的方法说明
    如果返回值是int(比如read()方法),那么-1代表读取到末尾
    原文(Jet Mah中文版jdk)为:
    “如果因为该流在文件未尾而无字节可用,则返回 -1 值;”如果返回值是一个对象(比如readObject()方法),那么没有比较统一的处理,参考具体文档吧╮( ̄▽ ̄)╭ 
      

  8.   

    忘记说了,末尾的返回值只和方法有关,同类关系不大。
    ObjectInputStream同样有继承自超类的read()方法,-1代表读取到末尾或者无数据可用(^╴^A;) 
      

  9.   


    就是这样了。PS:楼主我教你怎么贴代码:
    1、将代码作良好的格式化,以方便阅读。
    2、在发帖文本框的上方单击字体颜色右边的按钮,选择 Java
    3、将代码粘贴到【code=Java】和【/code】之间。就会得到下面的效果:public class Hello {    public static void main(String[] args) {
            System.out.println("Hello!");
        }
    }
      

  10.   

    方法之一:(常用的方法)将若干个对象(数量不定)都装入一个容器中(如: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;
    }
    ……