调用无数据的ObjectInputStream的readObject()会触发异常吗?
关于ObjectInputStream.readObject()无数据时的行为及Piped流跨线程读写说明
核心问题解答
- 当调用没有数据的
ObjectInputStream.readObject()时,线程会进入阻塞状态,直到对应的ObjectOutputStream写入数据,或者输出端的流被关闭。 - 如果输出端流被关闭(比如对应的
ObjectOutputStream或PipedOutputStream被关闭),此时readObject()会抛出EOFException——这是IOException的子类,属于I/O异常范畴。
Piped流配合Object流跨线程读写的注意事项
- 必须将
PipedInputStream和PipedOutputStream分别交给不同线程持有并操作,避免在同一个线程中同时操作两个流导致死锁。 - 写线程在完成数据写入后,务必调用
ObjectOutputStream.flush()确保数据推送到管道,或者调用close()(如果后续不再写入),否则读线程会一直阻塞在readObject()上。 - 读线程需要捕获
EOFException,以此判断写线程是否已经结束数据传输,避免无意义的阻塞。
内容的提问来源于stack exchange,提问作者Hareeswaran
相关产品推荐
相关产品推荐

