Tengo un archivo de 40MB en el disco y necesito "asignarlo" a la memoria mediante una matriz de bytes.Java: ByteArrayOutputStream eficiente en memoria
Al principio, pensé que escribir el archivo en un ByteArrayOutputStream sería la mejor manera, pero creo que se necesitan aproximadamente 160 MB de espacio en el montón en algún momento durante la operación de copia.
¿Alguien sabe una mejor manera de hacer esto sin utilizar tres veces el tamaño de archivo de RAM?
Actualización: Gracias por la respuesta. Me di cuenta de que podía reducir un poco el consumo de memoria diciéndole a ByteArrayOutputStream que el tamaño inicial era un poco mayor que el tamaño del archivo original (usando el tamaño exacto con mi código obliga a la reasignación, tengo que comprobar por qué).
Hay otro punto de alta memoria: cuando obtengo byte [] con ByteArrayOutputStream.toByteArray. Echando un vistazo a su código fuente, puedo ver que es la clonación de la matriz:
public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}
Estoy pensando tan sólo pudiera extender ByteArrayOutputStream y reescribir este método, por lo que para volver directamente a la matriz original. ¿Hay algún peligro potencial aquí, dado el flujo y la matriz de bytes no se utilizará más de una vez?
Pregunta similar http://stackoverflow.com/questions/964332/java-large-files-disk-io-performance – Santosh