Java序列化,ObjectInputStream.readObject(),检查是否将阻止(Jav

2019-07-20 08:08发布

我使用ObjectInputStream调用readObject在连载阅读Objects 。 我想避免这种方法块,所以我在寻找使用类似Inputstream.available()

InputStream.available()会告诉你有可用的字节, read()不会阻止。 是否有seriailzation等效的方法,将告诉你,如果有Object的可用和readObject不会堵塞?

Answer 1:

不可以。虽然你可以使用ObjectInputStream在另一个线程,并检查是否有可用的对象。 一般轮询是不是一个好主意,特别是较差的保证InputStream.available



Answer 2:

在Java序列化API不被设计为支持一个available()函数。 如果你实现了自己的对象读/写功能,可以读取任何数量的数据掉你喜欢的流,并没有报告方法。

所以readObject()不知道会有多大的数据读取,所以它不知道有多少个对象可用。

至于其他职位的建议,你最好的办法是阅读进入一个单独的线程。



Answer 3:

我有一个想法,通过增加其他的InputStream成链中的一个可以使读取的客户端可用性的信息:

HACK!

InputStream is = ... // where we actually read the data
BufferedInputStream bis = new BufferedInputStream(is);
ObjectInputStream ois = new ObjectInputStream(bis);

if( bis.available() > N ) {
  Object o = ois.readObject();
}

最棘手的问题是N的值应该足够大,以涵盖系列化头部和对象数据。 如果这些都存在不同似地,没有运气。



Answer 4:

该工程的BufferedInputStream我,为什么不检查(bis.available()> 0),而不是N值,这个工程完美的我。 我认为ObjectInputStream.readObject块(=等待直到)当没有输入时被读取。 因此,如果有任何输入在所有的流中又名如果(bis.available()> 0)ObjectInputStream.readObject不会阻塞。 请记住,ObjectInputStream.readObject可能抛出一个ClassNotFoundException,并且,在所有岂不等于一个问题给我。



文章来源: Java serialization, ObjectInputStream.readObject(), check if will block