A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩伟 中级黑马   /  2012-8-1 11:31  /  3127 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我在使用:
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("f:\\obj.txt"));
byte [] buf = new byte[1024];
ois.readFully(buf);
时发生了EOFException异常,这个异常是说:输入过程中意外到达文件或流的末尾时,抛出此异常。
我想问一下,既然提供了readFully()方法,难道方法内部没有提供读取到末尾的判断吗,还是我调用方法的形式错了。
请给位给指点一下!
{:soso_e183:}

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1 加油

查看全部评分

4 个回复

倒序浏览
给你看些代码!你就明白是怎么回事了!其实内部有进行判断,但是并没有进行处理!
而是直接抛出了异常!一下是JDK 的源代码:
  1.         public void readFully(byte[] b, int off, int len, boolean copy)
  2.             throws IOException
  3.         {
  4.             while (len > 0) {
  5.                 int n = read(b, off, len, copy);
  6.                 if (n < 0) {
  7.                     throw new EOFException();
  8.                 }
  9.                 off += n;
  10.                 len -= n;
  11.             }
  12.         }
复制代码
从这里不难看出!这里对异常并没有处理!而是直接抛出异常!
这里还要注意的一个问题就是其实 readFully和read的区别。
readFully方法并不是说一下就把整个文件读完了,不用去管是否到达文件末尾的异常。
readFully只是在读取数据的时候,会一直把缓冲区读满,否则一直处于阻塞状态而等待读取。
而read方法只是将字节流中的数据读完。那么数据在TCP协议传送的过程中,可能输入流接受到的数据并不完全,只是其中的一部分。而如果这时候的缓冲区没有满的话,readFully将会继续等待。知道缓冲区装满。希望对你有用!

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如果这样的话我感觉,readFully几乎就没什么用了,如果读不满缓冲区就阻塞,那岂不是永远无法执行完了吗。
还有,就算我要读的文件很大,可以用缓冲区循环读取,那么什么时候结束呢,难道是要等到抛出异常才算是结束吗。那这个方法是不是太特别了啊,它有什么具体的用处吗?
回复 使用道具 举报
韩伟 发表于 2012-8-1 14:11
如果这样的话我感觉,readFully几乎就没什么用了,如果读不满缓冲区就阻塞,那岂不是永远无法执行完了吗。
...

某些时候!你可能需要读出特定的长度的字段。比如一些数据的头信息之类的!
这时候如果你用read去读,那么可能还没有读完就个你返回来了。
但是如果去用readFully读,那么就会完整的给你读出来。
但是在更多的时候,如果不是确定要用特定长度的数据。还是用read去读。
用readFully有点危险。
回复 使用道具 举报
等用到网络编程的时候再好好研究研究,谢谢指点!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马