我使用ObjectInputStream
调用readObject
在连载阅读Objects
。 我想避免这种方法块,所以我在寻找使用类似Inputstream.available()
InputStream.available()
会告诉你有可用的字节, read()
不会阻止。 是否有seriailzation等效的方法,将告诉你,如果有Object
的可用和readObject
不会堵塞?
我使用ObjectInputStream
调用readObject
在连载阅读Objects
。 我想避免这种方法块,所以我在寻找使用类似Inputstream.available()
InputStream.available()
会告诉你有可用的字节, read()
不会阻止。 是否有seriailzation等效的方法,将告诉你,如果有Object
的可用和readObject
不会堵塞?
不可以。虽然你可以使用ObjectInputStream
在另一个线程,并检查是否有可用的对象。 一般轮询是不是一个好主意,特别是较差的保证InputStream.available
。
在Java序列化API不被设计为支持一个available()
函数。 如果你实现了自己的对象读/写功能,可以读取任何数量的数据掉你喜欢的流,并没有报告方法。
所以readObject()
不知道会有多大的数据读取,所以它不知道有多少个对象可用。
至于其他职位的建议,你最好的办法是阅读进入一个单独的线程。
我有一个想法,通过增加其他的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的值应该足够大,以涵盖系列化头部和对象数据。 如果这些都存在不同似地,没有运气。
该工程的BufferedInputStream我,为什么不检查(bis.available()> 0),而不是N值,这个工程完美的我。 我认为ObjectInputStream.readObject块(=等待直到)当没有输入时被读取。 因此,如果有任何输入在所有的流中又名如果(bis.available()> 0)ObjectInputStream.readObject不会阻塞。 请记住,ObjectInputStream.readObject可能抛出一个ClassNotFoundException,并且,在所有岂不等于一个问题给我。