我正在使用一个ObjectInputStream
来调用readObject
序列化的读取Objects
。我想避免使用此方法块,因此我希望使用类似Inputstream.available()
.
InputStream.available()
会告诉你有可用的字节并且read()
不会阻塞。是否有等效的序列化方法可以告诉您是否有Object
可用的 s 并且readObject
不会阻塞?
我正在使用一个ObjectInputStream
来调用readObject
序列化的读取Objects
。我想避免使用此方法块,因此我希望使用类似Inputstream.available()
.
InputStream.available()
会告诉你有可用的字节并且read()
不会阻塞。是否有等效的序列化方法可以告诉您是否有Object
可用的 s 并且readObject
不会阻塞?
不。尽管您可以ObjectInputStream
在另一个线程中使用 并检查它是否有可用的对象。通常轮询不是一个好主意,尤其是在InputStream.available
.
Java 序列化 API 不是为支持available()
函数而设计的。如果您实现自己的对象读取器/写入器功能,您可以从您喜欢的流中读取任意数量的数据,并且没有报告方法。
所以readObject()
不知道它会读取多少数据,所以它不知道有多少对象可用。
正如另一篇文章所建议的那样,您最好的选择是将阅读内容移到单独的线程中。
我有一个想法,通过将另一个 InputStream 添加到链中,可以使客户端可以读取可用性信息:
哈克!
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 会阻塞(= 等待直到)。因此,如果流中有任何输入,也就是 if(bis.available() > 0) ObjectInputStream.readObject 不会阻塞。请记住,ObjectInputStream.readObject 可能会抛出 ClassNotFoundException,这对我来说根本不是问题。