2012-07-31 27 views
6

Necesito obtener el tamaño en bytes de un InputStream sin crear una instancia de archivo. ¿Hay alguna forma de hacerlo utilizando Java NIO?Java InputStream tamaño

+2

¿Por qué necesitaría esto? – Jeffrey

+3

El contrato de 'InputStream' no dice nada en cuanto a ordenar que sea finito. – oldrinb

+1

O en lo que respecta a su definición por adelantado. – EJP

Respuesta

24

De un general InputStream? Tendría que seguir leyendo y leyendo (por ejemplo, en el mismo búfer, una y otra vez) contando cuántos bytes ha leído, hasta que llegue al final de la secuencia.

Por supuesto, entonces no podrá leer los datos en sí ... si desea hacerlo, deberá conservar los datos mientras los lee, p. Ej. copiándolo en un ByteArrayOutputStream.

(Si puede procesar los datos al mismo tiempo que calcula la longitud, simplemente hágalo; mientras lo lee usando un bucle, leyendo en el mismo búfer cada vez, simplemente incremente un contador para registrar . la cantidad que ha leído has realidad no nos proporcionó ninguna información sobre lo que quiere hacer con la corriente)

+1

O simplemente cópielo en el destino sobre la marcha, elimine el recuento y el ByteArrayOutputStream, y la latencia, y el espacio perdido por todo listo en la memoria. – EJP

+0

@EJP: Eso depende de lo que vayas a hacer después. Puede que no lo estés copiando a un destino. –

+0

Así que solo léalo y trátelo mientras lo hace. Sospecho mucho de las "soluciones" que comienzan leyendo toda la información, a menos que se sepa que la información es muy pequeña, en cuyo caso no es necesario saber qué tamaño tiene, ¿verdad? – EJP

1

Un par de opciones adicionales:.

Dependiendo de la naturalezabloqueo de la flujo de entrada, puede llamar al available() en la transmisión.

Si las transmisiones son pequeñas, puede escribirlas en PushbackInputStream s, contar los bytes y luego rebobinar.

+1

-1. available() does * not * devuelve el tamaño de una secuencia, y hay una advertencia específica en el Javadoc que lo dice. Y * todas las secuencias de entrada son bloqueadas. – EJP

+6

Tienes que contradecir. Compruebe el JavaDoc. http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#available%28%29. El valor de retorno de available() especifica que es la cantidad de bytes que se pueden leer ** sin ** bloquearse. Además, "En algunos casos, una lectura (o un salto) no bloqueante puede parecer bloqueada cuando es meramente lenta, por ejemplo al leer archivos grandes en redes lentas". Y en el caso de FileInputStreams, con frecuencia es un indicador confiable de tamaño. – Nicholas

+2

Eso es exactamente lo que dije. Es exactamente el * opuesto * de lo que dijiste.Dijo que available() se puede usar para devolver el tamaño de la secuencia de entrada, que es el tema de esta pregunta. Eso no es lo mismo que la cantidad de bytes que se pueden leer sin bloquear. Considera un socket. La parte después de "furthermore" no tiene relevancia aparente. Hay otra oración que no citó que específicamente advierte contra el uso en su última oración, y no hay nada en la pregunta sobre FileInputStream. – EJP

6

No se puede conocer en principio (considere un compañero que nunca deja de escribir), y no lo necesita. Simplemente lea y escriba en un bucle con un buffer de tamaño fijo. NIO no ofrece ninguna solución mágica.

-2

se puede obtener el tamaño de InputStream utilizando getBytes (InputStream) de Utils.java visite el siguiente enlace

Get Bytes from Inputstream

+0

En otras palabras, solo lea la secuencia hasta el final de la secuencia, o confíe en las propiedades no documentadas de ByteArrayInputStream. Un enlace de muy mala calidad, y no usa NIO que se especificó en la pregunta. -1 – EJP

Cuestiones relacionadas