2011-03-30 61 views
6

¿Cómo prueban ustedes un InputStream vacío? Sé que InputStream está diseñado para funcionar con recursos remotos, por lo que no puede saber si está allí hasta que realmente lo lea. No puedo usar read() porque la posición actual cambiaría y usar mark() y reiniciar parece ser inapropiado.Prueba de InputStream vacío en Java

El problema es que a veces uno no puede probar si read() devuelve -1, porque si tiene una secuencia y una biblioteca de terceros la usa, debe probar si está vacía antes de enviarla allí .

Por InputStreams vacíos que significan estos new ByteArrayInputStream(new byte[0])

Respuesta

12

Usted puede envolver su InputStream en un PushbackInputStream. Esta clase almacenará los primeros bytes desde read() en un buffer interno. Luego puede unread() los bytes y pasar el objeto a la biblioteca de terceros.

Realmente no me gusta ByteArrayInputStream, porque mantiene todos los datos de la secuencia en la memoria.

Además, en cualquier caso, se verá forzado a leer() para comprobar si hay una secuencia vacía, lo que significa que accederá a la red, al menos por unos pocos bytes.

0

¿El método available() en InputStream trabajo para usted?

+0

Parece la versión correcta de lo que John (a continuación) estaba buscando, aunque ligeramente diferente, ya que devuelve un principio int, pero el mismo principio. Sin embargo, me gustaría volver a redactarlo, porque la forma en que lo tiene escrito aquí hace que 'disponible()' parezca un método estático, que no lo es. Y si fuera un método estático, sería bastante inútil a menos que tomara una entrada, pero simplemente no es estático. – gnomed

+0

Chicos. Estaba esperando un poco más ... primero, ¿de verdad crees que no conozco uno de los pocos métodos de la interfaz inputStream? En segundo lugar, las implementaciones de IS implementan este método de manera diferente y dicen que no debes confiar en él ... – lisak

+0

@Edgar Parece que básicamente tienes tres opciones. 1) Trust available(), que se implementa de forma un poco diferente, pero para todo lo que sigue la API de Java es básicamente lo que se desea 2) Cargarlo en un Reader y verificar si está listo() 3) mark() y reset() . –

5

Un par de alternativas:

  • ByteArrayInputStreams y varias otras clases similares son, por definición, no bloqueante, como los datos ya están en la memoria de VM. En esos casos, el available() de InputStream podría ser lo que necesita. Esto no funciona cuando se lee desde una fuente de entrada externa al programa, p. un conector de red, la entrada estándar o incluso un archivo.

  • Si el método devuelve verdadero markSupported()InputStream para una instancia específica, que puede ser capaz de utilizar los métodos mark() y reset() para volver al comienzo de la corriente después de intentar utilizar read() en él.

EDIT:

Por cierto, ByteArrayInputStreams apoyo mark() y reset() bastante bien y son de forma predeterminada en la posición marcada 0. Este código:

InputStream x = new ByteArrayInputStream(new String("1234567890").getBytes()); 

byte b[] = new byte[1]; 

x.read(b, 0 , 1); 
System.out.println(b[0]); 

x.read(b, 0 , 1); 
System.out.println(b[0]); 

x.reset(); 

x.read(b, 0 , 1); 
System.out.println(b[0]); 

tiene esta salida:

49 
50 
49 
Cuestiones relacionadas