2009-10-01 23 views
5

estoy usando un ObjectInputStream llamar readObject para la lectura en serializado Objects. Me gustaría evitar bloquear este método, así que estoy buscando usar algo como Inputstream.available().Java serialización, ObjectInputStream.readObject(), compruebe si bloqueará

InputStream.available() le dirá que hay bytes disponibles y que read() no se bloqueará. ¿Existe un método equivalente para la serialización que le dirá si hay Object s disponibles y readObject no se bloqueará?

Respuesta

6

No. Aunque se podría utilizar el ObjectInputStream en otro hilo y comprobar para ver si eso tiene un objeto disponible. En general, las encuestas no son una gran idea, particularmente con las pobres garantías de InputStream.available.

4

La API de Java serialización no fue diseñado para soportar una función available(). Si implementa sus propias funciones de lectura/escritura de objetos, puede leer cualquier cantidad de datos de la transmisión que desee, y no hay ningún método de informe.

Así readObject() no se conoce la cantidad de datos que va a leer, por lo que no se sabe cuántos objetos están disponibles.

Como sugiere el otro post, lo mejor es mover la lectura en un hilo separado.

0

que tienen una idea de que mediante la adición de otro InputStream en la cadena se puede hacer la información de disponibilidad legible por el cliente:

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(); 
} 

El punto es complicado valor de N. Debe ser lo suficientemente grande como para cubrir tanto los datos de cabecera y la serialización de objetos. Si eso varía mucho, no hay suerte.

+1

si varían en absoluto, entonces se puede perder mucho. Si elige una N que es más grande que el siguiente objeto, entonces puede entrar en un estado de punto muerto donde está esperando más que el objeto actual, y el remitente no enviará el siguiente objeto hasta que responda al anterior. . ¡Asegúrate de que haya un suministro interminable de insumos antes de utilizar este enfoque! – PanCrit

0

El BufferedInputStream funciona para mí, y por qué no acaba de comprobar si (bis.available()> 0) en lugar de un valor N, esto funciona perfectamente para mí. Creo que ObjectInputStream.readObject bloquea (= espera hasta) cuando no se debe leer ninguna entrada. Entonces, si hay alguna entrada en la secuencia también conocida como (bis.available()> 0) ObjectInputStream.readObject no se bloqueará. Tenga en cuenta que ObjectInputStream.readObject podría lanzar una ClassNotFoundException, y eso no es un problema para mí.