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
Respuesta
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)
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
@EJP: Eso depende de lo que vayas a hacer después. Puede que no lo estés copiando a un destino. –
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
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. 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
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
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
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.
se puede obtener el tamaño de InputStream utilizando getBytes (InputStream) de Utils.java visite el siguiente enlace
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
- 1. Java InputStream espera datos.
- 2. Determine el tamaño de un InputStream
- 3. Java: InputStream marca de límite
- 4. Java SQL Resultado para InputStream
- 5. String de Java desde InputStream
- 6. Redes de Java: evented Socket/InputStream
- 7. Prueba de InputStream vacío en Java
- 8. Cambio de tamaño del mapa de bits de InputStream
- 9. Descomprimir un archivo de InputStream y devolver otro InputStream
- 10. Proceso InputStream
- 11. InputStream vs InputStreamReader
- 12. Cómo convertir byte [] a InputStream?
- 13. ¿Cómo convierto un InputStream a BufferedImage en Java/Groovy?
- 14. ¿Cómo convierto un InputStream a una cadena en Java?
- 15. Cómo convertir StringBuffer a InputStream en Java ME?
- 16. Java: ¿Cómo puedo obtener la codificación de inputStream?
- 17. Cierre correcto del proceso Java InputStream de getInputStream
- 18. Cómo utilizar la característica markSupported de inputstream java
- 19. Cómo hacer una copia profunda de un InputStream en Java
- 20. La diferencia de `InputStream`` DataInputStream` y `BufferedInputStream` en java?
- 21. ¿Hay una forma equivalente C# para Java InputStream y OutputStream?
- 22. Byte [] a InputStream o OutputStream
- 23. Android InputStream Internet Disconnect
- 24. CSVReader y InputStream
- 25. Convertir InputStream en BufferedReader
- 26. Copiando Http Request InputStream
- 27. Cómo clonar un InputStream?
- 28. Leer texto de InputStream
- 29. DocumentBuilder.parse cerrar el InputStream
- 30. DocumentBuilder.parse (InputStream) devuelve nulo
¿Por qué necesitaría esto? – Jeffrey
El contrato de 'InputStream' no dice nada en cuanto a ordenar que sea finito. – oldrinb
O en lo que respecta a su definición por adelantado. – EJP