Java序列化,ObjectInputStream.readObject(),检查是否会阻塞
我正在使用ObjectInputStream
来调用readObject
以读取序列化Objects
。 我想避免使用此方法块,所以我希望使用类似Inputstream.available()
东西。
InputStream.available()
会告诉你有可用的字节, read()
不会阻塞。 是否存在一种等效的串行化方法,它将告诉您是否有可用的Object
并且readObject
不会阻塞?
ObjectInputStream
。虽然您可以在另一个线程中使用ObjectInputStream
并检查是否有可用的对象。 一般来说,轮询并不是一个好主意,特别是对于InputStream.available
的不良保证。
Java序列化API不是为支持available()
函数而设计的。 如果您实现自己的对象读取器/写入器function,则可以从您喜欢的流中读取任意数量的数据,并且没有报告方法。
因此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对我有用,为什么不检查if(bis.available()> 0)而不是N值,这对我来说非常适合。 我认为当没有输入要读取时,ObjectInputStream.readObject会阻塞(=等待直到)。 因此,如果流中有任何输入,如果(bis.available()> 0)ObjectInputStream.readObject将不会阻塞。 请记住,ObjectInputStream.readObject可能会抛出ClassNotFoundException,这对我来说根本不是问题。