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,这对我来说根本不是问题。