5

我正在使用一个ObjectInputStream来调用readObject序列化的读取Objects。我想避免使用此方法块,因此我希望使用类似Inputstream.available().

InputStream.available()会告诉你有可用的字节并且read()不会阻塞。是否有等效的序列化方法可以告诉您是否有Object可用的 s 并且readObject不会阻塞?

4

4 回答 4

8

不。尽管您可以ObjectInputStream在另一个线程中使用 并检查它是否有可用的对象。通常轮询不是一个好主意,尤其是在InputStream.available.

于 2009-10-01T01:06:28.070 回答
5

Java 序列化 API 不是为支持available()函数而设计的。如果您实现自己的对象读取器/写入器功能,您可以从您喜欢的流中读取任意数量的数据,并且没有报告方法。

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

正如另一篇文章所建议的那样,您最好的选择是将阅读内容移到单独的线程中。

于 2009-10-01T01:15:19.420 回答
0

我有一个想法,通过将另一个 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 的值。它应该足够大以涵盖序列化标头和对象数据。如果这些变化很大,那就没有运气了。

于 2009-10-01T02:54:48.687 回答
0

BufferedInputStream 对我有用,为什么不检查 if(bis.available() > 0) 而不是 N 值,这对我来说非常有用。当没有输入被读取时,我认为 ObjectInputStream.readObject 会阻塞(= 等待直到)。因此,如果流中有任何输入,也就是 if(bis.available() > 0) ObjectInputStream.readObject 不会阻塞。请记住,ObjectInputStream.readObject 可能会抛出 ClassNotFoundException,这对我来说根本不是问题。

于 2011-06-29T10:22:57.347 回答